『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory
為什么80%的碼農(nóng)都做不了架構師?>>> ??
幾點說明
?
三種工廠的說明
簡單工廠(SimpleFactory):定義一個類來負責創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都具有共同的父類或接口。
工廠方法(FactoryMethod):定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,使一個類的實例化延遲到了子類。
抽象工廠(AbstractFactory):提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無須指定它們的具體類。
?
三種工廠的實現(xiàn)
注意:Singleton.SingletonOperateClass_1/2/3/4/5/6 是使用之前寫的一個關于單例模式的筆記時創(chuàng)建的。
簡單工廠的實現(xiàn)思路:在工廠類中,使用一個以「產(chǎn)品基類」作為返回值類型的方法,用于生產(chǎn)。這個方法需要有一個參數(shù),用于表述需要創(chuàng)建的是哪一種「產(chǎn)品子類」。然后再在這個方法中進行判斷,以返回相應的對象。
簡單工廠的好處:通過使用工廠方法來創(chuàng)建對象,可以有效的解決在創(chuàng)建對象時耦合性過高的問題。如果我在客戶類中,直接使用New來實例化產(chǎn)品類,那么,如果當我想使用另一種更好的類來替代之前的類的時候,我就得每一個客戶類中都去修改。而使用工廠方法,就可以做到只修改這一個方法,從而實現(xiàn)低耦合性。當然,簡單工廠的一個很致命的缺點,就是必須要知道傳入什么以及會傳出什么。這樣對于類的擴展不是十分的方便。
「簡單工廠 - Simple Factory」 public static Singleton.OperateBase getSingletonOperateClass(int selected) {switch (selected) {case 1:return Singleton.SingletonOperateClass_1.Operate;case 2:return Singleton.SingletonOperateClass_2.Single;case 3:return Singleton.SingletonOperateClass_3.Operate;case 4:return Singleton.SingletonOperateClass_4.Operate;case 5:return Singleton.SingletonOperateClass_5.Operate;case 6:return Singleton.SingletonOperateClass_6.Operate;default:return null;} }工廠方法的實現(xiàn)思路:如果說,簡單工廠是使用傳入的參數(shù)來控制生成什么樣的子類來返回,從而在解決耦合性問題的同時,也帶來了不夠靈活的問題。那么工廠方法就是使用多個相應對象的工廠來返回實例化后的子類,而不是通過傳入?yún)?shù)來控制。
這里根據(jù)一篇參考的文章中提出的方法,可以使用反射來解決工廠方法中,要使用哪種子類,以及解決簡單工廠中的傳入?yún)?shù)的問題。個人覺得十分的好!具體的實現(xiàn)方法,就是寫一個XML配置文件,或者干脆寫在app.config中,然后來讀取相應的節(jié)點,從而獲取到有關的參數(shù)信息。
「工廠方法 - Factory Method」 /// <summary> /// Factory Mathod Interface /// </summary> public interface IFactory_A {Singleton.OperateBase getSingletonOperateClass(); } /// <summary> /// Factory Method 1 /// </summary> public sealed class OperateFactory_1: IFactory_A {public Singleton.OperateBase getSingletonOperateClass() {return Singleton.SingletonOperateClass_1.Operate;}}/// <summary>/// Factory Method 2/// </summary> public class OperateFactory_2: IFactory_A {public Singleton.OperateBase getSingletonOperateClass() {return Singleton.SingletonOperateClass_2.Single;} }抽象工廠的實現(xiàn)思路:如果說簡單工廠與工廠方法是對同一個問題的兩種不同的解決方法的話,抽象工廠就是解決一系列這種問題的方法。因為其主要的作用就是生產(chǎn)一系列相互依賴的對象,而不用去關心它們具體的實現(xiàn)。
當然,抽象工廠相對于前兩種方法來說,也是有一點復雜的。而也正是從這種方法開始,使用設計模式就需要一個好的「設計」了,不然會很驚訝的發(fā)現(xiàn),越用設計模式,所產(chǎn)生的問題越多、系統(tǒng)越復雜、可控性越差。
這個模式的實現(xiàn)相對來說,還是比較直觀的。首先要有一個總的工廠接口或者抽象類(建議使用接口),這個接口就是在客戶類中,要實例化的那個模板。然后要有這個接口的多種不同的工廠實現(xiàn)類。具體有多少個實現(xiàn)類,這個要看你的系統(tǒng)需要而定。這些實現(xiàn)類都是用于實例化一系統(tǒng)的產(chǎn)品對象。也就是說,我們還要有一系列的產(chǎn)品對象用于實例化。我們首先要有這一系列產(chǎn)品對象的抽象類,然后再針對每一個系列創(chuàng)建相應的子類,當然,子類的數(shù)量以及內(nèi)容還是要看你具體的需要了。
「抽象工廠 - Abstract Factory」 public interface IFactory_A {ProductBass_1 getProduct_1();ProductBass_2 getProduct_2(); } public sealed class OperateFactory_1: IFactory_A {public static ProductBass_1 getProduct_1() {return new ProductClass_1_1();}public static ProductBass_2 getProduct_2() {return new ProductClass_2_1();} } public class OperateFactory_2: IFactory_A {public ProductBass_1 getProduct_1() {return new ProductClass_1_2();}public ProductBass_2 getProduct_2() {return new PorductClass_2_2();}}/// <summary> /// Description of ProductBass_1. /// </summary> public abstract class ProductBass_1 {} public class ProductClass_1_1: ProductBase_1 {public ProductClass_1_1() {} } public class ProductClass_1_2: ProductBase_1 {public ProductClass_1_2() {} } public abstract class ProductBass_2 {} public class ProductClass_2_1: ProductBase_2 {public ProductClass_2_1() {} } public class ProductClass_2_2: ProductBase_2 {public ProductClass_2_2() {} }三種工廠的區(qū)別
?
相比較而言,簡單工廠在實現(xiàn)上是最簡單的,工廠方法在實現(xiàn)上,較簡單工廠更復雜一點,但在靈活性上,更好一些。而抽象工廠方法是這三種方法中,最復雜的一種,當然,其與之前兩種要解決的問題也有一定的區(qū)別。
我們可以認為,抽象工廠的實現(xiàn)是依托于之前兩種方法的。我們也可以認為,抽象工廠是對之前兩種方法在創(chuàng)建一系列對象上不足的一個有效補充。
如果說,在設計上做到極致,或整體項目比較小的話,在簡單工廠與工廠方法中,個人比較傾向于簡單工廠這種方式。因為其不用包含太多的子類。
有文章指出,簡單工廠在內(nèi)聚方面不夠充分。這在OOP方面,確實是簡單工廠的一個感傷。但是如果我們的換種思路去考慮的話,將工廠類看做是一個靜態(tài)不變對象,其也是一個高內(nèi)聚的實現(xiàn),因為其只有一個作用,就是生產(chǎn)……當然,這是有點阿Q了……
?
參考
轉(zhuǎn)載于:https://my.oschina.net/skyler/blog/706183
總結
以上是生活随笔為你收集整理的『创建型』简单工厂SimpleFactory、工厂方法FactoryMethod、抽象工厂AbstractFactory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac安装brew和zsh
- 下一篇: 简单封装 HTTP 请求