c 抽象工廠模式

2022-03-07 04:32:27 字數 3740 閱讀 2363

先來看抽象工廠的大體的結構圖

要想明白上面的這幅類圖的話,先必須要明確乙個概念,

產品族:

在上面的產品列表中呢,有兩個產品族,乙個是「具體產品a--1」和」具體產品b--1「組成的乙個族,

還有乙個是「具體產品a--2」和「具體產品b--2」組成的乙個族。

產品族就是在不同產品等級結構中,功能相關聯的產品組成的家族。

下面就來介紹抽象工廠了(有些內容生澀的話,可以看完 demo 後回過頭來瀏覽)

下面給出的是抽象工廠的定義:

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

再來看衣服詳細的類圖

其實從上面這副類圖中可以看出,每乙個具體的工廠,它都只負責建立乙個產品族中的產品的例項,

從抽象工廠中派生出的具體工廠,這些具體工廠產生相同的產品(這些產品都繼承自同一父類),

比如,concretefactory1 和 concretefactory2 中的 createproducta 這個方法都是產生 abstractproducta 這種型別的產品,

但是產品的實現卻是不同的,比如 concretefactory1 中的 createproducta 實現的是產生乙個 concreteproducta—1 產品,

而 concretefactory2 中的 createproducta 實現的是產生乙個 concreteproducta—2 產品,

總的來說就是不同的具體工廠產生不同的產品族,

而抽象工廠則是定義乙個負責建立一組產品(也就是乙個產品族)的介面,

比如上面的類圖中只存在兩個產品族,所以在抽象工廠中便只需要定義兩個介面就可以了。

下面來剖析一下抽象工廠的優點和缺點

抽象工廠的最大好處在於交換產品系列非常方便,由於具體工廠類在乙個應用中只需要在初始化的時候出現一次,

這樣就使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置,

比如,我在應用中本來使用的是工廠 concretefactory1 來生成的產品族 1 ,

而現在需求改變了,不再使用產品族 1 ,而必須使用產品族 2 時,

此時,只需要在客戶端**中初始化 concretefactory1 的位置,

把 concretefactory1 改為 concretefactory2 就可以了,這樣就成功的將產品族1 切換到了使用產品族2 上面來,

其次,抽象工廠讓具體的建立例項過程與客戶端分離,客戶端是通過他們的抽象介面操縱例項,

產品的具體類名也被具體工廠的實現分類,不會出現在客戶端**中。

這一點上的話,簡單工廠和工廠方法也做得很不錯,即依賴於抽象。

同時,如果需求需要擴充套件的話,比如,要重新增加乙個產品族,這也很好辦,

只需要增加乙個具體工廠,然後增加產品族就可以了,

總之是,抽象工廠很好的遵循了開--閉原則和依賴倒置原則。

下面就來看乙個 demo ,從這個 demo 中看出抽象工廠的優點

先來展現一下具體的類圖

上面的類圖呢,說明的是有兩個具體工廠,乙個是 linux 控制項的製造,還有乙個是 windows 控制項的製造,

然後,有兩個產品族,乙個是 windowstextbox 和 linuxtextbox 組成的 textbox 產品族,

還有乙個就是 windowsbutton 和 linuxbutton 組成的 button 產品族。

下面就來寫類了

先來看工廠類吧

namespaceabstractfactory}

namespaceabstractfactory

public overridetextboxcreatetextbox()  } 

}namespaceabstractfactory

public overridetextboxcreatetextbox()  } 

}下面就給出所有的產品類

namespaceabstractfactory}

using system;

namespaceabstractfactory

",this.gettype().tostring()); 

} } 

}using system;

namespaceabstractfactory

",this.gettype().tostring()); 

} } 

}namespaceabstractfactory}

using system;

namespaceabstractfactory

",this.gettype().tostring()); 

} } 

}using system;

namespaceabstractfactory

",this.gettype().tostring()); 

} } 

}上面就是整個 demo 的類了,下面就是看一下 main 函式和效果了

using system; 

usingabstractfactory;

namespaceabstractfactorytest

}從上面 main 函式來看的話,如果你的系統本來是基於 linux 的話,你只需更改一行**

factory =new windowsfactory(); 

即可實現將系統更改為 windows ,

抽象工廠在這種情況下是非常有用的,比如,如果要實現後台資料庫從 oracle 轉換到 sql server,

則採用抽象工廠的思想實現是最好的。

下面總結一下抽象工廠的優缺點

首先,抽象工廠的話,其可以更加方便的實現交換乙個產品系列,

就像上面的 demo 中可以輕易的實現從 linux 上轉換為 windows,

同時,客戶端**中依賴的是抽象,而非具體的實現,

但是,抽象工廠也是有缺點的,其實這個缺點也很明顯,那就是顯得過於臃腫,

上面的 demo 儘管還只有兩個產品族,類圖就顯得有些難看了,

如果產品族一多的話,那麼總的類數是成幾倍的增加,這樣使整個結構變得過於複雜,

類的結構也會變得更為龐大。

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

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

C 抽象工廠模式

using system namespace abstractfactory foreach ifactory c in gc 的鍵鼠套裝 c c.createkeyboard sayhi c.createmouse sayhi console.writeline 滑鼠介面 滑鼠必須具備的功能 pu...

c 工廠模式與抽象工廠模式。

工廠模式與抽象工廠模式,相信同行不會陌生 在網上及相關書裡面也看過這方面的介紹 推薦這兩本書 steven john metsker s design patterns in c 和 gof s design pattern framework2.0 今天抽點時間,寫點這方面的東西,希望能起到一點拋...