【設計模式學習筆記】 之 抽象工廠模式
阿新 • • 發佈:2018-02-15
etc 但是 應該 err actor 增加 都是 困難 之間
簡介:
抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
舉例:每個汽車4s店和某個品牌工廠之間的關系,每個汽車4s店只會賣同一品牌的汽車,但是如果這一品牌汽車銷量不好,效益不佳,那麽4s店可以更換進貨的工廠,從而更換其售賣的品牌。
分析:每個品牌的汽車都有一個品牌工廠,這些工廠都有一個生產汽車的方法,4s店中應持有工廠的引用,所以這些汽車工廠都應該實現一個汽車工廠接口,這個4s店中持有汽車工廠的接口,以便更換汽車工廠改變品牌。
實現:
汽車工廠是用來生產汽車的,所以首先應該有一個汽車接口,所有汽車都有一個run方法
1 package com.mi.abstractfactory;2 3 public interface Car { 4 5 void run(); 6 }
實現這個接口創建一款汽車
package com.mi.abstractfactory; /** * 沃爾沃汽車 */ public class VolvoCar implements Car{ @Override public void run() { System.out.println("沃爾沃:別趕路,去感受路!"); } }
有了汽車類了,這樣就可以使用工廠來批量生產了,創建一個汽車工廠接口,其中包含一個生產汽車的方法
1 packagecom.mi.abstractfactory; 2 3 /** 4 * 汽車工廠接口 5 * @author hellxz 6 */ 7 public interface AbstractCarFactory { 8 9 //接口中所有的沒有使用權限修飾符的方法,都是public static final的 10 Car getCar(); 11 }
2.實現一個品牌汽車工廠
1 package com.mi.abstractfactory; 2 /** 3 * 沃爾沃汽車工廠 4 */ 5 public class VolvoCarFactory implementsAbstractCarFactory { 6 7 @Override 8 public VolvoCar getCar() { 9 return new VolvoCar(); 10 } 11 12 }
3.創建一個汽車4s店,這個店鋪需要有一個賣車的方法saleCar(),並持有一個工廠的引用
1 package com.mi.abstractfactory; 2 3 public class SSSS { 4 5 /** 6 * 實現抽象工廠對象的 註入有兩種方式,一種是set設值註入,構造方法,都持有接口的引用 7 */ 8 //持有引用,可以根據多態性,傳入該接口的實現類型,從而實現不同的效果 9 private AbstractCarFactory carFactory; 10 11 public Car saleCar() { 12 return carFactory.getCar(); //抽象工廠獲取方式得到car對象,可以是car的子類,多態 13 } 14 15 public void setCarFactory(AbstractCarFactory carFactory) { 16 this.carFactory = carFactory; 17 } 18 19 }
為了能看出來更換工廠的效果,同理創建一個Benz汽車的類和工廠
1 package com.mi.abstractfactory; 2 3 /** 4 * 奔馳汽車 5 * @author hellxz 6 */ 7 public class BenzCar implements Car { 8 9 @Override 10 public void run() { 11 System.out.println("奔馳:隨時準備好上路疾駛!"); 12 } 13 14 }
1 package com.mi.abstractfactory; 2 3 /** 4 * 奔馳汽車工廠 5 * @author hellxz 6 */ 7 public class BenzCarFactory implements AbstractCarFactory { 8 9 @Override 10 public BenzCar getCar() { 11 return new BenzCar(); 12 } 13 14 // 也可以這樣寫,返回父類的引用,因為多態(動態綁定),在運行的時候會確定該類型 的具體類型 15 /* public Car getCar() { 16 * return new BenzCar(); 17 * } 18 */ 19 20 }
測試類
1 package com.mi.abstractfactory; 2 3 /** 4 * @author hellxz 5 */ 6 public class Test { 7 8 public static void main(String[] args) { 9 SSSS ssss = new SSSS(); 10 // ssss.setCarFactory(new BenzCarFactory()); //奔馳的工廠 11 ssss.setCarFactory(new VolvoCarFactory()); //沃爾沃的工廠 12 Car car = ssss.saleCar(); 13 car.run(); 14 } 15 }
輸出:
沃爾沃:別趕路,去感受路!
測試更換工廠,打開註釋行,註釋掉沃爾沃的工廠行
輸出:
奔馳:隨時準備好上路疾駛!
總結:
主要解決:主要解決接口選擇的問題。
何時使用:一個系統中有多個系列可選擇的情況,每次只能選擇其中一系列
優點:
- 當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
- 降低耦合
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 接口 裏加代碼,又要在具體的裏面加代碼。
使用場景: 1、更換一整套的產品 2、生成不同操作系統的程序。
【設計模式學習筆記】 之 抽象工廠模式