抽象工厂模式是创建型设计模式的一种,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在C#开发中,当系统需要独立于产品创建、组合和表示时,或者需要强调一系列相关产品对象的设计约束时,抽象工厂模式就能发挥重要作用。

抽象工厂模式的核心角色
理解抽象工厂模式的角色是正确实现它的基础,主要包含以下四个核心角色:
- 抽象工厂(AbstractFactory):声明一组用于创建所有抽象产品的方法,每个方法对应一种产品。
- 具体工厂(ConcreteFactory):实现抽象工厂接口,负责创建具体的产品对象。
- 抽象产品(AbstractProduct):为每种产品声明接口,所有具体产品都需要实现这个接口。
- 具体产品(ConcreteProduct):实现抽象产品接口,是具体工厂创建的对象。
C#实现抽象工厂模式的步骤
1. 定义抽象产品接口
首先定义两个相关的抽象产品,比如我们模拟一个跨平台的UI组件系统,有按钮和文本框两种组件:
// 抽象按钮产品
public interface IButton
{
void Render();
}
// 抽象文本框产品
public interface ITextBox
{
void InputText(string text);
}
2. 定义具体产品类
针对不同的系统风格,实现对应的具体产品:
// Windows风格按钮
public class WindowsButton : IButton
{
public void Render()
{
Console.WriteLine("渲染Windows风格的按钮");
}
}
// Windows风格文本框
public class WindowsTextBox : ITextBox
{
public void InputText(string text)
{
Console.WriteLine($"Windows文本框输入内容:{text}");
}
}
// Mac风格按钮
public class MacButton : IButton
{
public void Render()
{
Console.WriteLine("渲染Mac风格的按钮");
}
}
// Mac风格文本框
public class MacTextBox : ITextBox
{
public void InputText(string text)
{
Console.WriteLine($"Mac文本框输入内容:{text}");
}
}
3. 定义抽象工厂接口
抽象工厂接口声明创建所有抽象产品的方法:
public interface IGUIFactory
{
IButton CreateButton();
ITextBox CreateTextBox();
}
4. 定义具体工厂类
每个具体工厂对应一组相关的具体产品:
// Windows风格UI工厂
public class WindowsGUIFactory : IGUIFactory
{
public IButton CreateButton()
{
return new WindowsButton();
}
public ITextBox CreateTextBox()
{
return new WindowsTextBox();
}
}
// Mac风格UI工厂
public class MacGUIFactory : IGUIFactory
{
public IButton CreateButton()
{
return new MacButton();
}
public ITextBox CreateTextBox()
{
return new MacTextBox();
}
}
5. 客户端调用示例
客户端通过抽象工厂接口创建产品,无需依赖具体产品类:
public class Application
{
private readonly IButton _button;
private readonly ITextBox _textBox;
// 构造函数注入抽象工厂
public Application(IGUIFactory factory)
{
_button = factory.CreateButton();
_textBox = factory.CreateTextBox();
}
public void RenderUI()
{
_button.Render();
_textBox.InputText("测试输入内容");
}
}
class Program
{
static void Main(string[] args)
{
// 根据配置选择具体工厂,这里模拟选择Windows风格
IGUIFactory factory = new WindowsGUIFactory();
Application app = new Application(factory);
app.RenderUI();
Console.WriteLine("--- 切换为Mac风格 ---");
// 切换工厂即可切换整套UI风格
factory = new MacGUIFactory();
app = new Application(factory);
app.RenderUI();
}
}
抽象工厂模式的优缺点
优点
- 客户端与具体产品解耦,只需要依赖抽象接口,符合依赖倒置原则。
- 保证同一工厂创建的产品是相互兼容的,避免不同风格产品混用的问题。
- 符合开闭原则,新增产品族时只需要新增具体工厂和具体产品,无需修改现有代码。
缺点
- 新增产品等级结构(比如新增下拉框组件)时,需要修改抽象工厂和所有具体工厂,违反开闭原则。
- 类数量会比较多,每增加一个产品族就会新增多个类,增加系统复杂度。
适用场景
当你的C#项目符合以下场景时,可以考虑使用抽象工厂模式:
- 系统需要独立于产品创建、组合和表示,比如需要支持多数据库、多UI风格的场景。
- 系统需要配置多个产品族中的一个来运行,比如根据部署环境选择不同的服务实现。
- 你需要强调一系列相关产品对象的设计约束,确保这些产品一起使用时是兼容的。
注意:抽象工厂模式和工厂方法模式的核心区别在于,抽象工厂模式创建的是一族产品,而工厂方法模式创建的是单个产品。在实际使用中需要根据需求选择合适的模式。
C#抽象工厂模式设计模式Abstract_Factory修改时间:2026-07-22 18:27:23