文章目錄
- 1.抽象工廠模式定義
- 2.UML類圖
- 3.抽象工廠模式具體實現
- 工廠模式實現單一產品族
- 抽象工廠實現多產品族
- 產品類
- 工廠類
- 使用
- 4.抽象工廠模式優缺點
1.抽象工廠模式定義
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。 工廠方法模式是單一產品族,抽象工廠方模式是多系列產品族。
2.UML類圖
- 抽象工廠:聲明了創建抽象產品對象的操作接口。
- 具體產品工廠:實現了抽象工廠的接口,負責創建產品對象。
- 產品抽象類或接口:定義一類產品對象的接口。
- 具體產品實現:定義一個將被相應具體工廠創建的產品對象。
3.抽象工廠模式具體實現
本文基于生產電腦周邊產品的例子
工廠模式實現單一產品族
public abstract class Keyboard
{// 生產鍵盤public abstract void Create();
}public class HPKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生產惠普鍵盤");}
}public class DellKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生產戴爾鍵盤");}
}public class LenovoKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生產聯想鍵盤");}
}// 鍵盤工廠抽象類
public abstract class KeyboardFactory
{// 取得鍵盤實例public abstract Keyboard GetInstance();
}public class HPKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new HPKeyboard();}
}public class DellKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new DellKeyboard();}
}public class LenoveKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new LenovoKeyboard();}
}
使用:
// 生產惠普鍵盤
new HPKeyboardFactory().GetInstance().Create();
// 生產戴爾鍵盤
new DellKeyboardFactory().GetInstance().Create();
// 生產聯想鍵盤
new LenoveKeyboardFactory().GetInstance().Create();
抽象工廠實現多產品族
產品類
// 鼠標抽象類
public abstract class Mouse
{public abstract void Create();
}public class DellMouse : Mouse
{public override void Create(){Console.WriteLine("生產戴爾鼠標");}
}public class HPMouse : Mouse
{public override void Create(){Console.WriteLine("生產惠普鼠標");}
}// 顯示器抽象類
public abstract class Monitor
{public abstract void Create();
}public class DellMonitor : Monitor
{public override void Create(){Console.WriteLine("生產戴爾顯示器");}
}public class HPMonitor : Monitor
{public override void Create(){Console.WriteLine("生產惠普顯示器");}
}
工廠類
// 工廠抽象類。工廠分為Dell工廠和HP工廠,各自負責品牌內產品的創建
public abstract class Factory
{public abstract Keyboard CreateKeyboard();public abstract Mouse CreateMouse();public abstract Monitor CreateMonitor();
}public class DellFactory : Factory
{public override Keyboard CreateKeyboard(){return new DellKeyboard();}public override Monitor CreateMonitor(){return new DellMonitor();}public override Mouse CreateMouse(){return new DellMouse();}
}public class HPFactory : Factory
{public override Keyboard CreateKeyboard(){return new HPKeyboard();}public override Monitor CreateMonitor(){return new HPMonitor();}public override Mouse CreateMouse(){return new HPMouse();}
}
使用
// 抽象工廠模式
Console.WriteLine("----------------------- 抽象工廠模式 ----------------------------");
new DellFactory().CreateKeyboard().Create(); // 生產戴爾鍵盤
new DellFactory().CreateMonitor().Create(); // 生產戴爾顯示器
new DellFactory().CreateMouse().Create(); // 生產戴爾鼠標new HPFactory().CreateKeyboard().Create(); // 生產惠普鍵盤
new HPFactory().CreateMonitor().Create(); // 生產惠普顯示器
new HPFactory().CreateMouse().Create(); // 生產惠普鼠標
4.抽象工廠模式優缺點
- 優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
- 缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。