一.介紹工廠模式的用途與特點
- 工廠方法模式是一種創建型設計模式, 其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。
- 定義工廠方法模式(Fatory Method Pattern)是指定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行
工廠模式是一種常用的設計模式,它用來封裝對象的創建過程,以便在程序中隨時根據需要生成對象的實例。在工廠模式中,我們將對象的創建過程封裝在一個工廠類中,客戶端無需關心對象的創建過程,只需要調用工廠類的方法即可獲取到想要的對象。
工廠模式常見的有三種形式:簡單工廠模式、工廠方法模式和抽象工廠模式。
二.簡單工廠模式
使用后:
1. 基本介紹
簡單工廠模式是最基本的工廠模式,它通過一個工廠類來創建不同類型的對象,而客戶端只需要傳遞不同的參數給工廠類即可獲得不同類型的對象實例。簡單工廠模式有三個角色:工廠類、抽象產品類和具體產品類。其中,工廠類負責創建不同類型的對象,抽象產品類定義了產品的公共接口,具體產品類則實現了不同類型產品的具體生產過程。
2. 傳統的方式的改進
例子:
比如我們這時要新增加一個Pizza的種類(Pepper披薩),我們需要做如下修改.
改進的思路分析 :
分析:修改代碼可以接受,但是如果我們在其它的地方也有創建Pizza的代碼,就意味著,也需要修改,而創建Pizza的代碼,往往有多處。
思路:把創建Pizza對象封裝到一個類中,這樣我們有新的Pizza種類時,只需要修改該類就可,其它有創建到Pizza對象的代碼就不需要修改了。(簡單工廠模式)
3. 項目應用-i18n國際演示
語言的切換
public class Software {public static void main(String[] args) {I18n i18n = I18NFactory.getI18NObject("china");System.out.println(i18n.getTitle());}
}
public interface I18n {public String getTitle();
public class I18NFactory {public static I18n getI18NObject(String area){if (area.equals("china")){return new Chinese();}else if (area.equals("spain")){return new Spainish();}else if (area.equals("italy")) {return new Italian();} else {return null;}}
}
public class Spainish implements I18n{public String getTitle(){return "Sistema de gestion del personal";}
}
public class Italian implements I18n{public String getTitle(){return "Sistema della direzione del personale";}
}
public class Chinese implements I18n{public String getTitle(){return "人事管理系統";}
}
好處:功能與功能之間更加明確,之間的耦合度降低
4. 簡單工廠模式的優缺點
優點是實現了對象創建和使用的職責分離,c端不需要知道創建產品的具體過程,在不修改任何代碼的情況下可以增加新的具體產品類
缺點是違反了設計模式的ocp原則,即對擴展開放,對修改關閉。即當我們給類增加新功能的時候,就需要修改工廠類。在產品類型較多的情況下工廠邏輯會變復雜,不利于維護。
二.工廠方法模式
工廠方法模式是簡單工廠模式的一種變形形式,它對簡單工廠模式進行了更細粒度的劃分,通過定義工廠接口和工廠實現類的方式,讓每個工廠只生產一種產品,從而更好地滿足開閉原則。工廠方法模式同樣有三個角色:抽象工廠類、抽象產品類和具體產品類。在工廠方法模式中,每個具體產品類都對應一個具體的工廠類,客戶端需要知道的是具體的工廠實現類,通過它來創建所需要的對象實例。
抽象工廠
public interface FactoryI18n {I18n create();
}
public class FactoryItalian implements FactoryI18n{@Overridepublic Italian create() {return new Italian();}
}
public class FactoryChinese implements FactoryI18n {@Overridepublic Chinese create() {return new Chinese();}
}
抽象產品
abstract class I18n {public I18n(){}
}public class Italian extends I18n{public Italian() {System.out.println("Sistema della direzione del personale");}
}public class Chinese extends I18n{public Chinese(){System.out.println("人事管理系統");}
}
客戶端
public class Software{public static void main(String[] args) {FactoryChinese factoryChinese = new FactoryChinese();Chinese chinese = factoryChinese.create();FactoryItalian factoryItalian = new FactoryItalian();Italian software = factoryItalian.create();}
}
三.抽象工廠模式
抽象工廠模式是對工廠方法模式的一種擴展,它也是針對多個產品族的情況下設計的,它不僅需要提供產品的創建方法,還需要提供創建產品族的方法。在抽象工廠模式中,抽象工廠類定義了創建產品組的方法,而具體工廠類則負責生產產品組,每個產品組中包含多個產品,即每個工廠將生產多個產品,而每個產品又分別由不同的具體工廠進行實現。
//發動機型號
public interface Engine {
}
public class EngineA implements Engine {public EngineA(){System.out.println("制造-->EngineA");}
}
public class EngineB implements Engine {public EngineB(){System.out.println("制造-->EngineB");}
}//空調型號
public interface Aircondition {
}
public class AirconditionA implements Aircondition{public AirconditionA(){System.out.println("制造-->AirconditionA");}
}
public class AirconditionB implements Aircondition{public AirconditionB(){System.out.println("制造-->AirconditionA");}
}
//創建工廠接口
public interface AbstractFactory {//制造發動機public Engine createEngine();//制造空調public Aircondition createAircondition();
}public class FactoryBMW320 implements AbstractFactory{@Overridepublic Engine createEngine() {return new EngineA();}@Overridepublic Aircondition createAircondition() {return new AirconditionA();}
}public class FactoryBMW523 implements AbstractFactory {@Overridepublic Engine createEngine() {return new EngineB();}@Overridepublic Aircondition createAircondition() {return new AirconditionB();}
}
public class Custormer {public static void main(String[] args) {//生產報名320系列配件FactoryBMW320 factoryBMW320 = new FactoryBMW320();factoryBMW320.createEngine();factoryBMW320.createAircondition();//生成寶馬523系列配件FactoryBMW523 factoryBMW523 = new FactoryBMW523();factoryBMW523.createEngine();factoryBMW523.createAircondition();}
}
四.工廠模式小結
- 工廠模式的意義
將實例化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦。從而提高項目的擴展和維護性。 - 三種工廠模式 (簡單工廠模式、工廠方法模式、抽象工廠模式)
- 設計模式的依賴抽象原則
- 創建對象實例時,不要直接 new 類, 而是把這個new 類的動作放在一個工廠的方法中,并返回。有的書上說,變量不要直接持有具體類的引用。
- 不要讓類繼承具體類,而是繼承抽象類或者是實現interface(接口)
- 不要覆蓋基類中已經實現的方法