出處:https://www.cnblogs.com/wyy1234/
閱讀目錄
1.抽象工廠模式介紹
上一篇我們了解了工廠模式,知道工廠模式可以解決簡單工廠的缺陷(簡單工廠添加新產品時要修改工廠類,不符合開閉原則),但是簡單工廠和工廠模式都是只生產一種產品(前邊的簡單工廠和工廠都只生產鼠標),實際上戴爾和惠普公司不僅生產鼠標還生產鍵盤,為了解決系列產品的問題,就有了抽象工廠模式。我們就以生產鼠標和鍵盤為例來理解抽象工廠。
產品類,包括鼠標類和鍵盤類:
//鼠標抽象類
public abstract class Mouse
{
public abstract void Print();
}
//戴爾鼠標
public class DellMouse : Mouse
{
public override void Print()
{
Console.WriteLine("生產了一個Dell鼠標!");
}
}
//惠普鼠標
public class HpMouse : Mouse
{
public override void Print()
{
Console.WriteLine("生產了一個惠普鼠標!");
}
}
//鍵盤抽象類
public abstract class Keybo
{
public abstract void Print();
}
//戴爾鍵盤類
public class DellKeybo : Keybo
{
public override void Print()
{
Console.WriteLine("生產了一個戴爾鍵盤!");
}
}
//惠普鍵盤
public class HpKeybo : Keybo
{
public override void Print()
{
Console.WriteLine("生產了一個惠普鍵盤!");
}
}
工廠類, 抽象工廠類提供了生產鼠標和生產鍵盤的抽象方法,戴爾工廠繼承了抽象工廠,實現抽象方法時只創建自己品牌的鼠標和鍵盤;惠普工廠同理,代碼如下:
/// <summary>
/// Pc產品工廠抽象類
/// </summary>
public abstract class PcFactory
{
public abstract Mouse CreateMouse();
public abstract Keybo CreateKeybo();
}
//戴爾pc工廠
public class DellPcFactroy : PcFactory
{
public override Keybo CreateKeybo()
{
return new DellKeybo();
}
public override Mouse CreateMouse()
{
return new DellMouse();
}
}
//惠普pc工廠
public class HpPcFactory : PcFactory
{
public override Mouse CreateMouse()
{
return new HpMouse();
}
public override Keybo CreateKeybo()
{
return new HpKeybo();
}
}
客戶端代碼:
class Program
{
static void Main(string[] args)
{
//生產一個戴爾鼠標/鍵盤
PcFactory dellFactory = new DellPcFactroy();
Mouse dellMouse= dellFactory.CreateMouse();
Keybo dellKeybo = dellFactory.CreateKeybo();
dellMouse.Print();
dellKeybo.Print();
//生產一個惠普鼠標/鍵盤
PcFactory hpFactory = new HpPcFactory();
Mouse hpMouse = hpFactory.CreateMouse();
Keybo hpKeybo = hpFactory.CreateKeybo();
hpMouse.Print();
hpKeybo.Print();
Console.ReadKey();
}
}
程序運行結果如下:

我們可以看出抽象工廠和工廠模式的區別在於:抽象工廠可以生產多種產品(兩種:鼠標和鍵盤),而工廠模式只生產一種產品(鍵盤),抽象工廠主要時解決生產系列產品的問題。思考一下:如果抽象工廠中只有一種產品是什么情況呢?只有一種產品的抽象工廠其實就是工廠模式,我們可以把工廠模式看作是抽象工廠的一個特例。
2.小結
上邊例子的類圖:

抽象工廠的優點:抽象工廠具有工廠模式的優點,對添加系列產品符合閉合原則(工廠模式的系列產品只有一種)。如要生產華碩的鼠標和鍵盤,只需要添加一個AsusPcFactory(繼承與PcFactory),AsusMouse(繼承Mouse),AsusKeybo(繼承Keybo),就可以在客戶端通過以下代碼生產華碩鼠標和鍵盤:
PcFactory asusPcFactory=new AsusPcFactory(); asusPcFactory.CreateMouse();//生產華碩鼠標 asusPcFactory.CreaetKeybo();//生產華碩鍵盤
抽象模式的缺點:抽象模式對添加新產品不符合開閉原則。如要生產顯示器,不僅要添加顯示器抽象類和顯示器具體類,還需要修改PcFactory,在抽象工廠中添加一個CreateDisplay抽象方法(或接口),戴爾工廠和惠普工廠也要實現新增的抽象方法(或者接口)。

