设计模式之抽象工厂 C# 范例
在设计模式中,抽象工厂模式(Abstract Factory Pattern) 是一种创建型模式,它提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定具体类。这种模式的关键在于通过抽象工厂来封装产品的创建,允许系统独立于具体产品类的创建、组合和表示。
在 C# 中,抽象工厂模式通常会涉及以下几个组件:
- 抽象工厂(Abstract Factory):定义了创建一系列产品的方法。
- 具体工厂(Concrete Factory):实现抽象工厂,负责实例化具体产品对象。
- 抽象产品(Abstract Product):为一类产品声明接口。
- 具体产品(Concrete Product):实现抽象产品接口,定义产品的具体行为。
示例:抽象工厂模式的 C# 实现
假设我们要设计一个跨平台的 UI 工具包,其中包括按钮(Button)和复选框(Checkbox)。每个平台的按钮和复选框外观不同,抽象工厂模式可以帮助我们根据平台创建相应的按钮和复选框对象。
1. 定义抽象产品(Button 和 Checkbox)
// 抽象产品 Button
public interface IButton
{
void Render();
void OnClick();
}
// 抽象产品 Checkbox
public interface ICheckbox
{
void Render();
void OnCheck();
}
2. 定义具体产品(Windows 和 Mac 上的按钮和复选框)
// 具体产品 WindowsButton
public class WindowsButton : IButton
{
public void Render()
{
Console.WriteLine("Rendering Windows Button");
}
public void OnClick()
{
Console.WriteLine("Windows Button Clicked");
}
}
// 具体产品 MacButton
public class MacButton : IButton
{
public void Render()
{
Console.WriteLine("Rendering Mac Button");
}
public void OnClick()
{
Console.WriteLine("Mac Button Clicked");
}
}
// 具体产品 WindowsCheckbox
public class WindowsCheckbox : ICheckbox
{
public void Render()
{
Console.WriteLine("Rendering Windows Checkbox");
}
public void OnCheck()
{
Console.WriteLine("Windows Checkbox Checked");
}
}
// 具体产品 MacCheckbox
public class MacCheckbox : ICheckbox
{
public void Render()
{
Console.WriteLine("Rendering Mac Checkbox");
}
public void OnCheck()
{
Console.WriteLine("Mac Checkbox Checked");
}
}
3. 定义抽象工厂(创建按钮和复选框)
// 抽象工厂
public interface IGUIFactory
{
IButton CreateButton();
ICheckbox CreateCheckbox();
}
4. 定义具体工厂(Windows 和 Mac 工厂)
// 具体工厂 WindowsFactory
public class WindowsFactory : IGUIFactory
{
public IButton CreateButton()
{
return new WindowsButton();
}
public ICheckbox CreateCheckbox()
{
return new WindowsCheckbox();
}
}
// 具体工厂 MacFactory
public class MacFactory : IGUIFactory
{
public IButton CreateButton()
{
return new MacButton();
}
public ICheckbox CreateCheckbox()
{
return new MacCheckbox();
}
}
5. 使用抽象工厂
// 客户端代码,使用抽象工厂模式来创建产品对象
public class Application
{
private IButton _button;
private ICheckbox _checkbox;
// 通过工厂来创建不同平台的控件
public Application(IGUIFactory factory)
{
_button = factory.CreateButton();
_checkbox = factory.CreateCheckbox();
}
public void RenderUI()
{
_button.Render();
_checkbox.Render();
}
public void OnButtonClick()
{
_button.OnClick();
}
public void OnCheckboxCheck()
{
_checkbox.OnCheck();
}
}
6. 客户端代码
class Program
{
static void Main(string[] args)
{
// 创建 Windows 平台的工厂
IGUIFactory factory = new WindowsFactory();
Application app = new Application(factory);
app.RenderUI();
app.OnButtonClick();
app.OnCheckboxCheck();
Console.WriteLine();
// 创建 Mac 平台的工厂
factory = new MacFactory();
app = new Application(factory);
app.RenderUI();
app.OnButtonClick();
app.OnCheckboxCheck();
}
}
输出:
Rendering Windows Button
Rendering Windows Checkbox
Windows Button Clicked
Windows Checkbox Checked
Rendering Mac Button
Rendering Mac Checkbox
Mac Button Clicked
Mac Checkbox Checked
解释:
IGUIFactory
是抽象工厂,它定义了方法CreateButton
和CreateCheckbox
,用于创建不同平台上的按钮和复选框。WindowsFactory
和MacFactory
是具体工厂,分别创建 Windows 和 Mac 上的控件。IButton
和ICheckbox
是抽象产品接口,WindowsButton
、MacButton
、WindowsCheckbox
和MacCheckbox
是具体产品。Application
类通过抽象工厂来获取具体的产品对象,并使用它们来渲染 UI 和响应用户的操作。
优点:
- 抽象工厂模式允许客户端代码在运行时根据平台选择不同的产品族(如 Windows 或 Mac)。
- 客户端只依赖于抽象工厂接口,不需要关心具体产品的类,增强了系统的灵活性和可扩展性。
通过这种方式,我们可以在不同平台上使用不同的 UI 组件,而不需要修改客户端代码,从而提高了代码的可扩展性和维护性。