設計模式根據使用類型可以分為三種:1、 創建模式: Factory (工廠模式)、 Singleton (單態)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工廠方法模式。 2、 結構模式: Flyweight ( (共用模式)、 Bridge ( (橋模式)、 D ...
設計模式根據使用類型可以分為三種:
1、 創建模式: Factory (工廠模式)、 Singleton (單態)、 Builder ( (建造者模式)、 Prototype ( (原型模式)、工廠方法模式。
2、 結構模式: Flyweight ( (共用模式)、 Bridge ( (橋模式)、 Decorator ( (裝飾模式)、 Composite ( (組合模式)、 Adapter (適配器模式)、 Proxy ( (代理模式)、 Facade ( (外觀模式)。
3、 行為模式: Iterator (迭代模式) 、Template ( (模板模式)、 Chainof Responsibility ( ( 責 任 鏈 模 式 ) 、 Memento ( ( 紀 念 品 模 式 ) 、Mediator ( (中介模式)、 Interpreter ( (解釋器模式)、
Strategy (策略模式)、 State 、 Observer ( (觀察者模式)、 Visitor ( (訪問模式)、Command ( (命令模式)。
一、工廠模式(Factory)
工廠模式是在我們日常開發過程中使用頻率非常高的一種設計模式,其定義:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses(定義一個創建對象的介面,讓子類決定實例化哪個具體的類,並且使類的實例化放到子類中去).簡單的來說工廠模式就是就創建對象的時候類似於工廠一樣根據用戶的不同需求去生產不同的產品,從而避免了客戶每需要一種新的產品就需要一個專門的公司去生產(即需要去new 不同的對象)
簡單工廠模式(Simple Factory):具體代碼鏈接
場景:有兩種角色的人(老師、學生),不適使用工廠模式的時候需要分別去new這兩種類型的對象,使用工廠模式之後只需要在工廠類中根據不同的特性分別去創建不同的對象
優點:
1、實現了對責任的分割,對象的創建都在工廠內完成避免了客戶端去創建產品
2、客戶端只需要知道創建的產品名而不必關心具體的產品的類名
3、可以通過引入配置文件的方式在不修改客戶端代碼的前提下更換和增加新的實體產品
缺點:
1、所有的對象的創建都在工廠類完成,一旦工廠類出現異常整個系統都要受到影響
2、會增加系統中類的個數,增加了系統的複雜度
3、系統擴展性差,在新增加了產品就必須修改工廠類的代碼
Person類:
工廠類:
學生的實現類:
老師的實現類:
消費者類:
工廠方法(Factory Method):代碼鏈接
工廠方法模式和簡單工廠模式相比,抽象了工廠角色和產品角色,並將每個具體類的實例化放到了子類當中去了
場景:現有兩種角色的人(老師、學生)都需要參加考試這項活動,但是因為角色的不同在這項活動中的動作也不同(學生參加考試,老師監考)
優點:
1、用戶值只需要關心產品對應的工廠,無需關鍵創建細節
2、該模式的多態性設計使得工廠可以自主確定創建何種產品對象,而創建的細節是封裝在實體工廠的內部
3、加入新產品時無需修改抽象工廠和抽象產品,只需要添加一個實體工廠和一個實體的產品類即可,符合ocp原則
缺點:
1、在增加新產品時需要編寫新的實體產品類以及與之對應的實體工廠類,在一定成都上增加了系統的複雜度,給整個系統帶來額外的開銷
2、在客戶端中使用了抽象層定義,增加了系統的抽象性和理解難度,而且實現時使用到了反射,一定成都上增加了系統實現的難度
抽象產品類:
具體實現類:
抽象工廠類:
工廠實現類:
消費者類:
抽象工廠(Abstract Factory):代碼鏈接
場景:現需要生產兩款手機(iPhone 7和華為P10)
優點:
1、隔離了具體類的生成,使用戶不需要關心實體產品什麼時候被創建了
2、當一個抽象產品的多個對象(例如華為P系列手機中的P8、P9、p10)設計成實現同一個抽象產品時,能夠保證客戶端只使用同一種產品
缺點:
1、添加新的產品時難以擴展抽象工廠
抽象工廠類:
實體工廠類:
抽象產品類:
實體產品類:
消費者類:
總結:
工廠設計模式的使用主要時為了降低整個系統模塊之間的耦合成都,增加系統的可擴展性,在新增或修改功能時不修改或儘量少的修改原有的代碼,使得後期的系統維護變得更加簡單