一、抽象工廠的應用場景以及優缺點
1 應用場景:
如果系統需要多套的**解決方案,並且每套的**解決方案中又有很多相互關聯的產品型別,並且在系統中我們可以相互替換的使用一套產品的時候可以使用該模式,客戶端不需要依賴具體的實現。
2 優點:
抽象工廠模式將產品的建立工作遲到了具體工廠的子類中,我們宣告工廠類變數的時候是使用的抽象型別,同理,我們使用產品型別也是抽象型別。
這樣做就盡可能的減少了客戶端**與產品類之間的依賴,從而降低了系統的耦合度。耦合度降低了,對於後期的維護和擴充套件就更加的有利。
3 缺點:
抽象工廠模式很難支援增加新產品的變化,這是因為抽象工廠介面中已經明確了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,
這樣就涉及到抽象工廠類的以及所有子類的變化。也就違背了「開放--封閉」原則。
4.實現要點:
1)、如果沒有應對「多系列物件建立」的需求變化,則沒有必要使用abstractfactory模式,這時候使用簡單的靜態工廠完全可以。
2)、"系列物件"指的是這些物件之間有相互依賴、或作用的關係,例如遊戲開發場景中「道路」與「房屋」的依賴,「道路」與「地道」的依賴。
3)、abstractfactory模式主要在於應對「新系列」的需求變動。其缺點在於難以應對「新物件」的需求變動。
4)、abstractfactory模式經常和factorymethod模式共同組合來應對「物件建立」的需求變化。
二、模式的組成
1 抽象產品類角色(abstractproduct):
為抽象工廠中相互依賴的每種產品定義抽象介面物件,
也可以這樣說,有幾種產品,就要宣告幾個抽象角色, 每乙個抽象角色和一種具體的產品相匹配。
2 具體產品類(concreteproduct):
具體產品類實現了抽象產品類,是針對某個具體產品的實現的型別。
3 抽象工廠類角色(abstractfactory):
定義了建立一組相互依賴的產品物件的介面操作,每種操作和每種產品一一對應。
4 具體工廠類角色(concretefactory):
實現抽象類裡面的所有抽象介面操作,可以建立某系列具體的產品,這些具體的產品是「抽象產品類角色」的子類。
三、**
1.基本**:
#region 建立抽象類/// /// 房頂抽象類,子類的房頂必須繼承該類
///
public abstract class roof
/// /// 地板抽象類,子類的地板必須繼承該類
///
public abstract class floor
/// /// 窗戶抽象類,子類的窗戶必須繼承該類
///
public abstract class window
/// /// 房門抽象類,子類的房門必須繼承該類
///
public abstract class door
/// /// 桌子抽象類,子類的房門必須繼承該類
///
public abstract class dask
#endregion 建立抽象類
#region 實現具體類
/// /// 歐式地板類
///
public class europeanfloor : floor
}/// /// 歐式的房頂
///
public class europeanroof : roof
}/// ///歐式的窗戶
///
public class europeanwindow : window
}/// /// 歐式的房門
///
public class europeandoor : door
}/// /// 歐式桌子類
///
public class europeandask : dask
}/// /// 現代的房頂
///
public class modernizationroof : roof
}/// /// 現代的地板
///
public class modernizationfloor : floor
}/// /// 現代的窗戶
///
public class modernizationwindow : window
}/// /// 現代的房門
///
public class modernizationdoor : door
}/// /// 現代的桌子(擴充套件)
///
public class modernizationdask : dask
}#endregion 實現具體類
#region 建立抽象工廠類
/// /// 抽象工廠類,提供建立不同型別房子的介面
///
public abstract class abstractfactory
#endregion
#region 實現抽象工廠類
/// /// 歐式風格房子的工廠,負責建立歐式風格的房子
///
public class europeanfactory : abstractfactory
// 製作歐式地板
public override floor createfloor()
// 製作歐式窗戶
public override window createwindow()
// 製作歐式房門
public override door createdoor()
// 製作歐式桌子(擴充套件)
public override dask createdask()
}/// /// 現在風格房子的工廠,負責建立現代風格的房子
///
public class modernizationfactory : abstractfactory
// 製作現代地板
public override floor createfloor()
// 製作現代窗戶
public override window createwindow()
// 製作現代房門
public override door createdoor()
// 製作現代桌子只有現代有)
public override dask createdask()
}#endregion
2.擴充套件**:
新建一套古典風格的房子:
/// ///先為表弟的房子來建立乙個工廠類吧///
public class classicalfactory : abstractfactory
// 建立地板
public override floor createfloor()
// 建立窗戶
public override window createwindow()
// 建立房門
public override door createdoor()
}/// ///古典的房頂
///
public class classicalroof : roof
}/// /// 古典的地板
///
public class classicalfloor : floor
}/// /// 古典的窗戶
///
public class classicalwindow : window
}/// /// 古典的房門
///
public class classicaldoor: door
}
此時,只需要新增五個類:乙個是古典風格工廠類,負責建立古典風格的房子,另外幾個類是具有古典風格的房頂、地板、窗戶和房門的具體產品。
從上面**看出,抽象工廠對於系列產品的變化支援 「開放——封閉」原則(指的是要求系統對擴充套件開放,對修改封 閉),擴充套件起來非常簡便,
但是,抽象工廠對於增加新產品這種情況就不支援」開放——封閉 「原則,因為要修改建立系列產品的抽象基類 abstractfactory,增加相應產品的建立方法,這也是抽象工廠的缺點所在。
設計模式筆記 抽象工廠
好比如說,乙個部落格頁面有個換膚系統。那麼假如有兩套風格,黑和白。那麼,我選擇了黑色風格的,實際這步就相當通過換膚系統這個工廠製造器,建立出乙個黑色主題的工廠,該黑色主題的工廠內可以生產各種黑色風格的產品,比如黑色頭像掛飾,黑色背景,黑色的 等,然後通過這些黑色主題產品完成了整個換膚操作。白色主題也...
設計模式筆記 抽象工廠模式
抽象工廠模式向客戶端提供乙個介面,使得客戶端在不必指定具體型別的情況下,建立多個產品族中的物件。本文採取的仍然是接著以前的那個快餐店的例子。現在,快餐店經常良好,逐漸發展壯大,為了適合不同地方人的飲食習慣,建立了兩大系列 相當於產品族 快餐,北方系列和南方系列。每個系列分別由乙個大廚掌勺。抽象工廠模...
設計模式筆記 抽象工廠模式
摘要 介紹了抽象工廠模式的基本概念,並給出了c 語言編寫的程式示例 工廠模式圖 抽象工廠模式向客戶端提供乙個介面,使得客戶端在不必指定具體型別的情況下,建立多個產品族中的物件。本文採取的仍然是接著以前的那個快餐店的例子。現在,快餐店經常良好,逐漸發展壯大,為了適合不同地方人的飲食習慣,建立了兩大系列...