cs
using System;
using System.Reflection;
#region 产品接口
public interface IButton
{
void Paint();
}
public interface ITextBox
{
void Render();
}
#endregion
#region Windows 产品族
public class WindowsButton : IButton
{
public void Paint() => Console.WriteLine("Windows 风格按钮");
}
public class WindowsTextBox : ITextBox
{
public void Render() => Console.WriteLine("Windows 风格文本框");
}
#endregion
#region Mac 产品族
public class MacButton : IButton
{
public void Paint() => Console.WriteLine("Mac 风格按钮");
}
public class MacTextBox : ITextBox
{
public void Render() => Console.WriteLine("Mac 风格文本框");
}
#endregion
#region 抽象工厂
public interface IUIFactory
{
IButton CreateButton();
ITextBox CreateTextBox();
}
#endregion
#region 具体工厂
public class WindowsFactory : IUIFactory
{
public IButton CreateButton() => new WindowsButton();
public ITextBox CreateTextBox() => new WindowsTextBox();
}
public class MacFactory : IUIFactory
{
public IButton CreateButton() => new MacButton();
public ITextBox CreateTextBox() => new MacTextBox();
}
#endregion
#region 工厂加载器(通过反射)
public static class FactoryLoader
{
public static IUIFactory LoadFactory(string className)
{
// 获取当前程序集
Assembly asm = Assembly.GetExecutingAssembly();
// 根据类名创建实例
object obj = asm.CreateInstance(className);
return obj as IUIFactory ?? throw new ArgumentException("无法加载工厂: " + className);
}
}
#endregion
#region 客户端
class Program
{
static void Main()
{
// 假设这个值来自配置文件 / 数据库 / 用户输入
string factoryName = "MacFactory"; // 或 "WindowsFactory"
IUIFactory factory = FactoryLoader.LoadFactory(factoryName);
IButton button = factory.CreateButton();
ITextBox textBox = factory.CreateTextBox();
button.Paint();
textBox.Render();
}
}
#endregion
如果
factoryName = "MacFactory",输出
:Mac 风格按钮
Mac 风格文本框
如果
factoryName = "WindowsFactory",输出
:Windows 风格按钮
Windows 风格文本框
优点
1. 解耦 :客户端无需硬编码
new WindowsFactory()
,而是通过反射加载。2. 可扩展 :只需新增一个工厂类(比如
LinuxFactory
),不用改客户端代码。3. 灵活性:可以通过配置文件、数据库、甚至网络请求来决定加载哪个工厂。