九江做網(wǎng)站開發(fā)需要多少錢班級優(yōu)化大師網(wǎng)頁版登錄
工廠模式介紹
工廠模式是我們最常用的實(shí)例化對象模式了,是用工廠方法代替new操作的一種模式。它是創(chuàng)建型模式。
簡單工廠
簡單工廠模式是指由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例, 但它不屬于GOF 23種設(shè)計(jì)模式
簡單工廠適用于工廠類負(fù)責(zé)創(chuàng)建的對象較少的場景, 且客戶端只需要傳入工廠類的參數(shù), 對于如何創(chuàng)建對象的邏輯不需要關(guān)心
適用場景: 工廠類負(fù)責(zé)創(chuàng)建的對象較少 對于如何創(chuàng)建對象的邏輯不需要關(guān)心
優(yōu)點(diǎn): 只需要傳入一個正確的參數(shù) 就可以獲取所需要的對象 無需知道創(chuàng)建細(xì)節(jié)
缺點(diǎn): 違背開閉原則 不易于擴(kuò)展過于復(fù)雜的產(chǎn)品結(jié)構(gòu) 新增產(chǎn)品需要修改工廠類的代碼
以下我們用支付場景演示簡單工廠用法
1.定義支付接口
/*** 支付接口** @author Lion Li*/
public interface IPay {void payment();
}
2.編寫工廠實(shí)例
/*** 付款方式工廠** @author Lion Li*/
public class PayFactory {/*** 創(chuàng)建付款實(shí)例* Class<? extends IPay> 單一原則 限制必須是 IPay 的子類*/public IPay create(Class<? extends IPay> clazz) {if (null != clazz) {try {return clazz.newInstance();} catch (Exception e) {throw new RuntimeException(e);}}return null;}}
3.編寫具體的支付類 例如: 微信 支付寶
/*** 微信支付** @author Lion Li*/
public class WxPay implements IPay {public void payment() {System.out.println("微信支付");}
}
/*** 支付寶支付** @author Lion Li*/
public class ZfbPay implements IPay {public void payment() {System.out.println("支付寶支付");}
}
4.編寫測試類并運(yùn)行測試
/*** @author Lion Li*/
public class Test {public static void main(String[] args) {IPay wx = new PayFactory().create(WxPay.class);IPay zfb = new PayFactory().create(ZfbPay.class);wx.payment();zfb.payment();}
}
工廠方法模式
工廠方法模式是指定義一個創(chuàng)建對象的接口, 但讓實(shí)現(xiàn)這個接口的類來覺得實(shí)例化哪個類, 工廠方法讓類的實(shí)例化推遲到子類中進(jìn)行
適用場景: 創(chuàng)建對象需要大量重復(fù)的代碼 不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建 實(shí)現(xiàn)等細(xì)節(jié)
優(yōu)點(diǎn): 用戶只需要關(guān)心所需要產(chǎn)品對應(yīng)的工廠 無需關(guān)心創(chuàng)建細(xì)節(jié) 加入新產(chǎn)品符合開閉原則 提供了系統(tǒng)的可擴(kuò)展性
缺點(diǎn): 類的個數(shù)容易過多 增加的代碼的結(jié)構(gòu)負(fù)責(zé)都 增加了系統(tǒng)的抽象性和理解難度
以下我們用汽車場景工廠方法模式用法
1.定義汽車接口規(guī)范
/*** 汽車接口規(guī)范** @author Lion Li*/
public interface ICar {void name();
}
2.編寫汽車工廠接口規(guī)范
/*** 汽車工廠接口規(guī)范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
3.編寫具體的汽車種類 例如: 寶馬 大眾
/*** 寶馬汽車** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是寶馬");}
}
/*** 大眾汽車** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大眾");}
}
4.編寫具體的汽車工廠 例如: 寶馬工廠 大眾工廠
/*** 寶馬汽車工廠** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大眾汽車工廠** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
5.編寫測試類并運(yùn)行測試
/*** @author Lion Li*/
public class Test {public static void main(String[] args){ICarFactory baomaFactory = new BaoMaCarFactory();ICar baoma = baomaFactory.create();baoma.name();ICarFactory dazhongFactory = new DaZhongCarFactory();ICar dazhong = dazhongFactory.create();dazhong.name();}}
抽象工廠
抽象工廠模式是指提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口 無需指定他們具體的類
適用場景:
- 不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建等細(xì)節(jié) 強(qiáng)調(diào)一系列相關(guān)產(chǎn)品對象一起使用創(chuàng)建對象需要大量重復(fù)的代碼
- 提供一個產(chǎn)品類的庫 所有產(chǎn)品以同樣的接口出現(xiàn) 從而不依賴于具體的實(shí)現(xiàn)
優(yōu)點(diǎn): 具體產(chǎn)品在應(yīng)用層代碼隔離 無需關(guān)心創(chuàng)建細(xì)節(jié) 將一個系列的產(chǎn)品統(tǒng)一到一起創(chuàng)建
缺點(diǎn): 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合 產(chǎn)品中擴(kuò)展新產(chǎn)品困難 需要修改抽象工廠的接口 增加了系統(tǒng)的理解難度和抽象性
以下我們用多種出行方式來演示抽象工廠用法
1.定義產(chǎn)品接口規(guī)范
/*** 汽車接口規(guī)范** @author Lion Li*/
public interface ICar {void name();
}
/*** 飛機(jī)接口規(guī)范** @author Lion Li*/
public interface IAircraft {void name();
}
2.定義產(chǎn)品工廠接口規(guī)范
/*** 汽車工廠接口規(guī)范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
/*** 飛機(jī)工廠接口規(guī)范** @author Lion Li*/
public interface IAircraftFactory {IAircraft create();
}
3.定義所有產(chǎn)品實(shí)現(xiàn)
/*** 寶馬汽車** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是寶馬");}
}
/*** 大眾汽車** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大眾");}
}
/*** 波音飛機(jī)** @author Lion Li*/
public class BoYinAircraft implements IAircraft {public void name() {System.out.println("我是波音");}
}
/*** 空客飛機(jī)** @author Lion Li*/
public class KongKeAircraft implements IAircraft {public void name() {System.out.println("我是空客");}
}
4.定義所有產(chǎn)品工廠實(shí)現(xiàn)
/*** 寶馬汽車工廠** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大眾汽車工廠** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
/*** 波音飛機(jī)工廠** @author Lion Li*/
public class BoYinAircraftFactory implements IAircraftFactory {public IAircraft create() {return new BoYinAircraft();}
}
/*** 空客飛機(jī)工廠** @author Lion Li*/
public class KongKeAircraftFactory implements IAircraftFactory {public IAircraft create() {return new KongKeAircraft();}
}
5.定義交通工具抽象工廠
/*** 交通工具抽象工廠** @author Lion Li*/
public abstract class TransportationFactory {public void init() {System.out.println("初始化數(shù)據(jù)");}protected abstract ICar createCar(Class<? extends ICarFactory> clazz);protected abstract IAircraft createAircraft(Class<? extends IAircraftFactory> clazz);
}
6.定義出行方式工廠
/*** 出行方式工廠** @author Lion Li*/
public class TravelFactory extends TransportationFactory {@Overrideprotected ICar createCar(Class<? extends ICarFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}@Overrideprotected IAircraft createAircraft(Class<? extends IAircraftFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}
}
7.編寫測試類并運(yùn)行測試
/*** @author Lion Li*/
public class Test {public static void main(String[] args){TransportationFactory factory = new TravelFactory();ICar baoma = factory.createCar(BaoMaCarFactory.class);baoma.name();ICar dazhong = factory.createCar(DaZhongCarFactory.class);dazhong.name();IAircraft boyin = factory.createAircraft(BoYinAircraftFactory.class);boyin.name();IAircraft kongke = factory.createAircraft(KongKeAircraftFactory.class);kongke.name();}}
Spring 工廠 BeanFactory 解析
這里由于網(wǎng)上已經(jīng)有很多成熟的解析文檔 就不多做介紹了
推薦文章鏈接: Spring 的工廠模式 BeanFactory 是什么源碼刨析