一、描述
當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。好比不同品牌下有各式各樣的商品。
二、優劣勢
優點:用戶在使用時可以直接根據工廠類去創建所需的實例,而無需瞭解這些對象是如何創建以及如何組織的。有利於整個軟件 體系結構的優化。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象里加代碼,又要在具體的裏面加代碼。
三、需求
生產鼠標,有2個品牌,惠普和戴爾,每個品牌都能成產鼠標和鍵盤。
四、使用其他設計模式
簡單工廠:https://blog.csdn.net/dicunsi2939/article/details/103922023
工廠模式:https://blog.csdn.net/dicunsi2939/article/details/103923644
如果我們這邊也使用工廠模式,那麼就會出現惠普鼠標工廠、惠普鍵盤工廠,那麼從名字來看就有點耦合了,都是惠普工廠,幹嘛還分鼠標和鍵盤,所以我們引用抽象工廠。
五、使用設計模式
通過添加工廠類,生成產品的工作交給它來負責。
3個類,
MouseBase.cs -鼠標基類
HpMouse.cs -惠普鼠標類
DellMouse.cs -戴爾鼠標類
KeyBoardBase.cs 鍵盤基類
Hp KeyBoard.cs -惠普鍵盤類
Dell KeyBoard.cs -戴爾鍵盤類
FactoryBase.cs -抽象工廠基類
HpFactory.cs -惠普工廠
DellFactory.cs -戴爾工廠
//鼠標基類
public abstract class MouseBase
{
public abstract void Show();
}
//惠普鼠標
public class HpMouse : MouseBase
{
public override void Show()
{
Debug.Log("惠普鼠標老品牌值得信賴!");
}
}
//戴爾鼠標
public class DellMouse : MouseBase
{
public override void Show()
{
Debug.Log("戴爾鼠標帶給你不一樣的驚喜!");
}
}
//惠普鍵盤
public class HpKeyBoard : KeyBoardBase
{
public override void Show()
{
Debug.Log("惠普鍵盤!");
}
}
//戴爾鍵盤
public class DellKeyBoard : KeyBoardBase
{
public override void Show()
{
Debug.Log("戴爾鍵盤");
}
}
//抽象工廠基類
public abstract class FactoryBase
{
public abstract MouseBase CreateMouse();
public abstract KeyBoardBase CreateKeyBoard();
}
//惠普工廠
public class HpFactory : FactoryBase
{
public override KeyBoardBase CreateKeyBoard()
{
return new HpKeyBoard();
}
public override MouseBase CreateMouse()
{
return new HpMouse();
}
}
//戴爾工廠
public class DellFactory : FactoryBase
{
public override KeyBoardBase CreateKeyBoard()
{
return new DellKeyBoard();
}
public override MouseBase CreateMouse()
{
return new DellMouse();
}
}
//客戶端調用
public static void main(string[] args)
{
FactoryBase factory = new HpFactory();
//生產惠普鼠標和鍵盤
factory.CreateMouse();
factory.CreateKeyBoard();
factory = new DellFactory();
//生產戴爾鼠標和鍵盤
factory.CreateMouse();
factory.CreateKeyBoard();
}
運行結果
小結:我們抽象除一個工廠基類,裏面是可生產的產品,然後每個品牌作爲一個工廠類去繼承它,這樣就把同一個品牌的產品合併到同一個工廠了。
六、設計圖
通過學習,我們瞭解到了簡單工廠模式的應用,我們把剛剛的實現方式畫出來。
//沒什麼人看,就不畫了。
七、總結
工廠模式和抽象工廠的區分爲:是否有品牌多產品這一說。抽象工廠擴展起來比較麻煩,需要添加每個品牌的具體產品對象,也就是一個產品有幾個牌子就得寫幾個類,然後還得去工廠類里加上創建得方法。但不耦合就是了。
覺得有用就留下評論吧^-^