抽象工廠模式

2021-06-22 22:59:56 字數 2991 閱讀 4993

抽象工廠模式

抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。

為了方便引進抽象工廠模式,引進乙個新概念:產品族(product family)。所謂產品族,是指位於不同產品等級結構,功能相關聯的產品組成的家族。如圖:

圖中一共有四個產品族,分布於三個不同的產品等級結構中。只要指明乙個產品所處的產品族以及它所屬的等級結構,就可以唯一的確定這個產品。

引進抽象工廠模式

所謂的抽象工廠是指乙個工廠等級結構可以建立出分屬於不同產品等級結構的乙個產品族中的所有物件。如果用圖來描述的話,如下圖:

抽象工廠模式的通用類圖如圖

圖中描述的東西用產品族描述如下:

抽象工廠(abstract factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。

具體工廠(concrete factory)角色:這個角色直接在客戶端的呼叫下建立產品的例項。這個角色含有選擇合適的產品物件的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。

抽象產品(abstract product)角色:擔任這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。

具體產品(concrete product)角色:抽象工廠模式所建立的任何產品物件都是某乙個具體產品類的例項。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。

抽象工廠模式模擬**

抽象產品類a

public abstract class abstractproducta 

//每個產品相同方法,不同實現

public abstract void dosomething();

}

產品a1的實現

public class producta1 extends abstractproducta 

}

產品a2的實現

public class producta2 extends abstractproducta 

}

類似抽象產品類b、產品b1、產品b2

public abstract class abstractproductb 

//每個產品相同方法,不同實現

public abstract void dosomething();

}

public class productb1 extends abstractproductb 

}

public class productb2 extends abstractproductb 

}

抽象工廠類

public abstract class abstractcreator
注意有n個產品族,在抽象工廠類中就應該有n個建立方法。

產品等級1實現類

public class creator1 extends abstractcreator 

@override

public abstractproductb createproductb()

}

產品等級2實現類

public class creator2 extends abstractcreator 

@override

public abstractproductb createproductb()

}

注意有m個產品等級就應該有m個實現工廠類,在每個實現工廠中,實現不同產品族的生產任務。

測試**如下

public class testdemo 

}

結果

抽象工廠a共有方法

產品a1的實現方法

抽象工廠a共有方法

產品a2的實現方法

抽象工廠b共有方法

產品b1的實現方法

抽象工廠b共有方法

產品b2的實現方法

抽象工廠模式的優點

封裝性,每個產品的實現類不是高層模組要關係的,要關心的是什麼?是介面,是抽象,它不關心物件是如何建立出來,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能建立出乙個需要的物件,省時省力,優秀設計就應該如此。

產品族內的約束為非公開狀態。例如生產男女比例的問題上,猜想女媧娘娘肯定有自己的打算,不能讓女盛男衰,否則女性的優點不就體現不出來了嗎?那在抽象工廠模式,就應該有這樣的乙個約束:每生產1個女性,就同時生產出1.2個男性,這樣的生產過程對呼叫工廠類的高層模組來說是透明的,它不需要知道這個約束,我就是要乙個黃色女性產品就可以了,具體的產品族內的約束是在工廠內實現的。

抽象工廠模式的缺點

抽象工廠模式的最大缺點就是產品族擴充套件非常困難,為什麼這麼說呢?我們以通用**為例,如果要增加乙個產品c,也就是說有產品家族由原來的2個,增加到3個,看看我們的程式有多大改動吧!抽象類abstractcreator要增加乙個方法createproductc(),然後,兩個實現類都要修改,想想看,這在專案中的話,還這麼讓人活!嚴重違反了開閉原則,而且我們一直說明抽象類和介面是乙個契約,改變契約,所有與契約有關係的**都要修改,這段**叫什麼?叫「有毒**」,——只要這段**有關係,就可能產生侵害的危險!

抽象工廠模式 抽象工廠模式

抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...

工廠模式 抽象工廠模式

這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...

工廠模式 抽象工廠模式

子類父類代換 場景 在不同的條件下,需要建立不同的實現子類時。如網路通訊可以使用tcp udp。可以實現同乙個介面,通過工廠類根據條件 tcp或udp 來例項化不同的子類。這些子類符合黎克特制代換原則。public inte ce tlprotocol public class tcpimpleme...