最近這三個模式有點搞混了,而且網上也有類似情況。總結一下。
簡單工廠:嚴格說並不是乙個設計模式。簡單工廠沒有抽象類,只有乙個具體工廠類如myfactory,然後myfactory裡面有個工廠方法createproduct返回乙個基類產品,具體返回什麼具體例項通過傳入引數然後用case判斷。
用手機生產做個例子:
比如nokia
簡單工廠就是只有nokiafactory工廠類,工廠方法就是createnokiaphone,
引數是nokia手機型號,根據不同型號建立不同的nokia手機(使用case)。很明顯的缺點就是nokia每發明乙個新型號的手機都需要修改簡單工廠類(增加case判斷),違反了封閉修改,開放擴充套件原則。
工廠方法:該模式有乙個抽象基類和若干個派生的具體工廠類,基類定義了乙個虛工廠方法返回指定產品類的基類,派生類需要實現該虛方法並建立具體產品類返回。注意工廠方法的每個具體工廠只負責返回一種產品類。
同樣以手機生產做例子:
nokia工廠方法模式有乙個工廠基類
nokiafactory,注意此工廠和上面不一樣,是抽象的。該類定義乙個虛工廠方法create
nokiaphone,該方法返回
nokiaphone基類。然後不同型號的手機對應乙個該型號的手機工廠,比如n97factory,注意此工廠派生於nokiafactory基類,n97factory實現虛工廠方法,它返回值是具體的nokia
手機類,如new n97phone。(注意n97phone是nokiaphone的派生類
)這樣的優點就是,新出乙個nokia手機型號,只需派生乙個該型號的工廠而無需修改原來的**。符合封閉修改,開放擴充套件原則。
抽象工廠:該模式和工廠方法模式很相似,也是乙個抽象基類和若干個具體工廠類,不同的是抽象工廠的工廠基類定義了多個虛工廠方法,每個虛工廠方法負責返回一種產品,多個工廠方法返回多種產品,並且這些產品具有某些聯絡。
抽象工廠就不止生產nokia手機了,還生產相關的周邊產品,首先nokiafactory基類會定義兩個虛方法,乙個是createnokiaphone用來生產手機,另乙個是createnokiacharger用於生產對應型號的手機充電器(假定不同型號手機使用不同的充電器)。然後派生類n97factory就要生產兩種相關的產品,乙個是n97phone,還有乙個是n97charger,這兩個物件是對應的關係,因此封裝到抽象工廠來生產一系列相關的物件。
總結:用最簡單的話來概括就是,簡單工廠只有乙個具體工廠類來建立一種基類的多個不同派生類,工廠方法就是有多個派生於乙個基類的具體工廠類,每個具體工廠只生產一種基類的乙個派生類,抽象工廠也是只有乙個工廠基類,但是每個具體工廠生產多個相關基類的各乙個派生類。
**
簡單工廠,工廠方法,抽象工廠
簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。本文是本人對這三種模式學習後的乙個小結以及對他們之間的區別的理解。簡單工廠 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的引數的不同來返回不...
簡單工廠 工廠方法 抽象工廠
簡單工廠 乙個工廠類 根據傳入的參量決定建立出哪一種產品類的例項 直接乙個工廠類,內部通過 swith operator add類實現該介面 adddao implements dao dao的實現類 客戶端 dao dao new adddao dao.createoper 產生物件 這樣如果需要...
簡單工廠 工廠方法 抽象工廠
一 簡單工廠 factory 集中管理物件的產生,業務 只需要呼叫相應的方法,傳入不同的引數區分物件,就能得到想要的物件了 把業務 和對應的物件解耦 建立乙個抽象類 public abstract class cellphone public abstract void show 建立實現抽象類的實...