抽象工廠(Abstract Factory)

2022-07-19 09:57:12 字數 3144 閱讀 7695

常規的物件建立方法:

//建立乙個road物件

road road 

=new

road();

new 的問題:

實現依賴,不能應對「具體例項化型別」的變化。

解決思路:

封裝變化點-----**變化,封裝**

潛台詞: 如果沒有變化,當然不需要額外的封裝!

工廠模式的緣起

變化點在「物件建立」,因此就封裝「物件建立」

面向介面程式設計----依賴介面,而非依賴實現

最簡單的解決方法:

1class

roadfactory6}

7//建立乙個road物件

8road road

=roadfactory.createroad();

建立一系列相互依賴物件的建立工作:

假設乙個遊戲開場景:

我們需要構造"道路"、"房屋"、"地道","從林"...等等物件

工廠方法如下:

1class

roadfactory27

public

static

building createbuilding()811

public

static

tunnel createtunnel()

1215

public

static

jungle createjungle()

1619

}呼叫方式如下:1

road road 

=roadfactory.createroad();

3building building 

=roadfactory.createbuilding();

4tunnel tunnel 

=roadfactory.createtunnel();

5jungle jungle 

=roadfactory.createjungle();

如上可見簡單工廠的問題:

不能應對"不同系列物件"的變化。比如有不同風格的場景---對應不同風格的道路,房屋、地道....

如何解決:

使用物件導向的技術來"封裝"變化點。

動機(motivate):

在軟體系統中,經常面臨著"一系統相互依賴的物件"的建立工作:同時,由於需求的變化,往往存在更多系列物件的建立工作。

如何應對這種變化?如何繞過常規的物件建立方法(new),提供一種"封裝機制"來避免客戶程式和這種"多系列具體物件建立工作"的緊耦合?

意圖(intent):

提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

----《設計模式》gof

結構圖(struct):

適用性:

1.乙個系統要獨立於它的產品的建立、組合和表示時。

2.乙個系統要由多個產品系統中的乙個來配置時。

3.當你要強調一系列相關的產品物件的設計以便進行聯合使用時。

4.當你提供乙個產品類庫,而只想顯示它們的介面不是實現時。

生活例子:

結構圖**實現:

1abstract

class

abstractfactory21

abstract

class

abstractproducta21

abstract

class

abstractproductb21

class

client210

public

void

run()

1115}1

class

concretefactory1:abstractfactory27

public

override

abstractproductb createproductb()811

}1class

concretefactory2:abstractfactory27

public

override

abstractproductb createproductb()811

}1class

producta1:abstractproducta27

}1class

productb1:abstractproductb27

}1class

prodcuta2:abstractproducta27

}1class

productb2:abstractproductb27

}1public

static

void

main()

2abstract factory注意的幾點:

如果不存在」多系列物件建立「的需求變化,則沒必要應用abstract factory模式,靜態工廠方法足矣。

"系列物件"指的是這些物件之間有相互依賴、或作用的關係。例如遊戲開發場景中的"道路"與"房屋"依賴,「道路」與「地道」的依賴。

abstract factory模式主要在於應對"新系列"的需求變動。其缺點在於難以應對」新物件「的需求變動。

abstract factory模式經常和factory method模式共同組合來應對「物件建立」的需求變化。

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

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

工廠模式 抽象工廠

在看抽象工廠前,我們需要引入兩個概念 1 產品等級結構 2 產品族 我們現在有這樣兩個產品型別 汽車 car 自行車 bike 有兩家公司 寶馬 bmw 奧迪 audi 每乙個廠家都能夠生產這兩種型別的產品 bmw介面 bmwcar,bmwbike audi介面 audicar,audibike 在...

工廠模式 抽象工廠

1 為了提高內聚和松耦合,我們經常會抽象出一些類的公共介面以形成抽象基類或者介面。這樣我們可以通過宣告乙個指向基類的指標來指向實際的子類實現,達到了多型的目的。這裡很容易出現的乙個問題是 若干個子類繼承自抽象基類,我們必須在每次要用到子類的地方就寫如 new 的 這裡帶來兩個問題 1 客戶程式設計師...