在上一專題中介紹了工廠方法模式,工廠方法模式是為了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨著產品類的增加需要增加額外的**),而工廠方法模式每個具體工廠類只完成單個例項的建立,所以它具有很好的可擴充套件性。但是在現實生活中,乙個工廠只建立單個產品這樣的例子很少,因為現在的工廠都多元化了,乙個工廠建立一系列的產品,如果我們要設計這樣的系統時,工廠方法模式顯然在這裡不適用,然後抽象工廠模式卻可以很好地解決一系列產品建立的問題,這是本專題所要介紹的內容。
這裡首先以乙個生活中抽象工廠的例子來實現乙個抽象工廠,然後再給出抽象工廠的定義和uml圖來幫助大家更好地掌握抽象工廠模式,同時大家在理解的時候,可以對照抽象工廠生活中例子的實現和它的定義來加深抽象工廠的uml圖理解。
下面就以生活中 「絕味」 連鎖店的例子來實現乙個抽象工廠模式。例如,絕味鴨脖想在江西南昌和上海開分店,但是由於當地人的口味不一樣,在南昌的所有絕味的東西會做的辣一點,而上海不喜歡吃辣的,所以上海的所有絕味的東西都不會做的像南昌的那樣辣,然而這點不同導致南昌絕味工廠和上海的絕味工廠生成所有絕味的產品都不同,也就是某個具體工廠需要負責一系列產品(指的是絕味所有食物)的建立工作,下面就具體看看如何使用抽象工廠模式來實現這種情況。
/// /// 下面以絕味鴨脖連鎖店為例子演示下抽象工廠模式
/// 因為每個地方的喜歡的口味不一樣,有些地方喜歡辣點的,有些地方喜歡吃不辣點
/// 客戶端呼叫
///
class client
}/// /// 抽象工廠類,提供建立兩個不同地方的鴨架和鴨脖的介面
///
public abstract class abstractfactory
/// /// 南昌絕味工廠負責製作南昌的鴨脖和鴨架
///
public class nanchangfactory : abstractfactory
// 製作南昌鴨架
public override yajia createyajia()
}/// /// 上海絕味工廠負責製作上海的鴨脖和鴨架
///
public class shanghaifactory : abstractfactory
// 製作上海鴨架
public override yajia createyajia()
}/// /// 鴨脖抽象類,供每個地方的鴨脖類繼承
///
public abstract class yabo
/// /// 鴨架抽象類,供每個地方的鴨架類繼承
///
public abstract class yajia
/// /// 南昌的鴨脖類,因為江西人喜歡吃辣的,所以南昌的鴨脖稍微會比上海做的辣
///
public class nanchangyabo : yabo
}/// /// 上海的鴨脖沒有南昌的鴨脖做的辣
///
public class shanghaiyabo : yabo
}/// /// 南昌的鴨架
///
public class nanchangyajia : yajia
}/// /// 上海的鴨架
看完上面抽象工廠的實現之後,如果 「絕味」公司又想在湖南開一家分店怎麼辦呢? 因為湖南人喜歡吃麻辣的,下面就具體看看應用了抽象工廠模式的系統是如何應對這種需求的。
/// /// 如果絕味又想開一家湖南的分店時,因為湖南喜歡吃麻的
/// 所以這是有需要有一家湖南的工廠專門製作
///
public class hunanfactory : abstractfactory
// 製作湖南鴨架
public override yajia createyajia()
}/// /// 湖南的鴨脖
///
public class hunanyabo : yabo
}/// /// 湖南的鴨架
///
public class hunanyajia : yajia
}
此時,只需要新增三個類:乙個是湖南具體工廠類,負責建立湖南口味的鴨脖和鴨架,另外兩個類是具有湖南口味的鴨脖類和鴨架類。從上面**看出,抽象工廠對於系列產品的變化支援 「開放——封閉」原則(指的是要求系統對擴充套件開放,對修改封閉),擴充套件起來非常簡便,但是,抽象工廠對於新增新產品這種情況就不支援」開放——封閉 「原則,這也是抽象工廠的缺點所在,這點會在第四部分詳細介紹。
抽象工廠模式將具體產品的建立延遲到具體工廠的子類中,這樣將物件的建立封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴充套件,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方。下面就具體看下抽象工廠的缺點(缺點其實在前面的介紹中以已經涉及了):
抽象工廠模式很難支援新種類產品的變化。這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了「開發——封閉」原則。
知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:
設計模式 C 設計模式 抽象工廠模式
設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 抽象工廠模式包含如下角色 abstractfactory ...
c 設計模式(抽象工廠模式)
good 定義了乙個建立一系列相關或相互依賴的介面,而無需指定它們的具體類。用於交換產品系列,如access sql server 產品的具體類名被具體工廠的實現分離 例 include include include using namespace std 使用者抽象介面 class iuser ...
C 設計模式 抽象工廠模式
為建立一組相關或相互依賴的物件提供乙個介面,而且無需指定他們的具體類。抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供乙個介面,使客戶端在不必指定產品的具體的情況下,建立多個產品族中的產品物件。應用...