1. 程式人生 > >【設計模式學習筆記】 之 抽象工廠模式

【設計模式學習筆記】 之 抽象工廠模式

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 package
com.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 implements
AbstractCarFactory { 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. 降低耦合

缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 接口 裏加代碼,又要在具體的裏面加代碼。

使用場景: 1、更換一整套的產品 2、生成不同操作系統的程序。

【設計模式學習筆記】 之 抽象工廠模式