文章目录
- 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 里加代码,又要在具体的里面加代码。