设计模式 - 抽象工厂模式
概述
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式通过将一系列相关或相互依赖的对象的创建过程封装在一个工厂中,提高了代码的灵活性和可维护性。
结构
抽象工厂模式包含以下几个角色:
- 抽象产品(AbstractProduct):定义了产品的接口。
- 具体产品(ConcreteProduct):实现了抽象产品接口的具体类。
- 抽象工厂(AbstractFactory):声明了一组创建抽象产品的方法。
- 具体工厂(ConcreteFactory):实现了抽象工厂接口,创建具体产品的实例。
示例代码
假设我们有一个应用程序需要创建不同风格的UI组件(如按钮和文本框)
代码地址
抽象产品
public interface IButton
{
void Render();
}
public interface ITextBox
{
void Render();
}
具体产品
public class WinButton : IButton
{
public void Render()
{
Console.WriteLine("Rendering a Windows button.");
}
}
public class WinTextBox : ITextBox
{
public void Render()
{
Console.WriteLine("Rendering a Windows text box.");
}
}
public class MacButton : IButton
{
public void Render()
{
Console.WriteLine("Rendering a Mac button.");
}
}
public class MacTextBox : ITextBox
{
public void Render()
{
Console.WriteLine("Rendering a Mac text box.");
}
}
抽象工厂
public interface IUIFactory
{
IButton CreateButton();
ITextBox CreateTextBox();
}
具体工厂
public class WinFactory : IUIFactory
{
public IButton CreateButton()
{
return new WinButton();
}
public ITextBox CreateTextBox()
{
return new WinTextBox();
}
}
public class MacFactory : IUIFactory
{
public IButton CreateButton()
{
return new MacButton();
}
public ITextBox CreateTextBox()
{
return new MacTextBox();
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
IUIFactory factory;
IButton button;
ITextBox textBox;
// 创建Windows风格的UI组件
factory = new WinFactory();
button = factory.CreateButton();
textBox = factory.CreateTextBox();
button.Render();
textBox.Render();
// 创建Mac风格的UI组件
factory = new MacFactory();
button = factory.CreateButton();
textBox = factory.CreateTextBox();
button.Render();
textBox.Render();
}
}
应用场景
抽象工厂模式适用于以下场景:
- 当一个系统要独立于它的产品的创建、组合和表示时。
- 当一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
优缺点
优点
- 提高代码的灵活性:通过将一系列相关或相互依赖的对象的创建过程封装在一个工厂中,抽象工厂模式使得代码更加灵活和可扩展。
- 降低耦合度:客户端代码不需要知道具体产品类的名称,只需要知道抽象产品接口,从而降低了代码的耦合度。
缺点
- 增加代码复杂性:每增加一个产品系列,就需要增加一组相应的具体产品类和具体工厂类,导致代码量增加。