【设计模式】C#反射实现抽象工厂模式

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. 灵活性:可以通过配置文件、数据库、甚至网络请求来决定加载哪个工厂。

相关推荐
cliffordl7 小时前
设计模式(python)
python·设计模式
weixin_537590457 小时前
《C程序设计语言》练习答案(练习1-13)
c语言·开发语言·c#
a17798877128 小时前
小程序上传图像失败
小程序·c#
云道轩9 小时前
告诉 Claude Code 在项目中遵循特定的编程模式/设计模式和技术栈约束
设计模式·ai·agent·claude code
JosieBook9 小时前
【C#】C# 所有关键字总结
开发语言·算法·c#
我是唐青枫9 小时前
C#.NET ConcurrentStack<T> 深入解析:无锁栈原理、LIFO 语义与使用边界
网络·c#·.net
黑棠会长10 小时前
ABP框架09.数据安全与合规:审计日志与实体变更追踪
分布式·安全·架构·c#·abp
JMchen12310 小时前
Android NDK开发从入门到实战:解锁应用性能的终极武器
android·开发语言·c++·python·c#·android studio·ndk开发
花间相见11 小时前
【Java基础面试题】—— 核心知识点面试题(含答案):语法+集合+JVM+设计模式+算法
java·jvm·设计模式
IT小哥哥呀11 小时前
基于windows的个人/团队的时间管理工具
windows·c#·wpf·时间管理