C#怎么实现工厂模式

来源:网站主作者:下班再修头衔:程序员
导读:本期聚焦于小伙伴创作的《C#怎么实现工厂模式》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么实现工厂模式》有用,将其分享出去将是对创作者最好的鼓励。

工厂模式是C#开发中常用的创建型设计模式,核心目标是将对象的实例化过程封装起来,让调用方不需要直接依赖具体的类,只需要通过工厂获取对应的对象即可。这种模式能够有效降低代码之间的耦合度,当后续需要新增或修改产品类型时,不需要修改大量调用方的代码,只需要调整工厂的实现逻辑。

C#怎么实现工厂模式

工厂模式的核心组成

标准的工厂模式通常包含三个核心角色,各个角色的职责划分非常清晰:

  • 抽象产品:定义所有具体产品需要实现的公共接口或者抽象类,是所有产品对象的父类。
  • 具体产品:实现抽象产品定义的接口或者继承抽象类,是最终被创建出来的实际对象。
  • 工厂类:负责根据传入的参数或者条件,创建对应的具体产品对象并返回给调用方。

简单工厂模式的实现

简单工厂是最基础的工厂模式实现方式,通过一个统一的工厂类根据条件判断创建不同的产品对象,适合产品类型较少且不会频繁变动的场景。下面以日志输出为例,实现不同日志类型对象的创建。

定义抽象产品接口

首先定义所有日志产品的公共接口,所有具体日志类都需要实现这个接口:

// 抽象产品接口:日志接口
public interface ILogger
{
    // 输出日志的方法
    void WriteLog(string message);
}

定义具体产品类

实现两种不同的日志产品,分别是控制台日志和文件日志:

// 具体产品:控制台日志
public class ConsoleLogger : ILogger
{
    public void WriteLog(string message)
    {
        Console.WriteLine($"控制台日志:{message}");
    }
}

// 具体产品:文件日志
public class FileLogger : ILogger
{
    public void WriteLog(string message)
    {
        // 模拟写入文件的逻辑
        Console.WriteLine($"文件日志写入内容:{message}");
    }
}

实现简单工厂类

工厂类根据传入的日志类型参数,返回对应的日志对象:

// 简单工厂类
public class LoggerFactory
{
    // 根据类型创建日志对象
    public static ILogger CreateLogger(string loggerType)
    {
        switch (loggerType.ToLower())
        {
            case "console":
                return new ConsoleLogger();
            case "file":
                return new FileLogger();
            default:
                throw new ArgumentException("不支持的日志类型");
        }
    }
}

调用示例

调用方不需要直接实例化具体的日志类,只需要通过工厂获取对象即可:

class Program
{
    static void Main(string[] args)
    {
        // 获取控制台日志对象
        ILogger consoleLogger = LoggerFactory.CreateLogger("console");
        consoleLogger.WriteLog("这是一条测试日志");

        // 获取文件日志对象
        ILogger fileLogger = LoggerFactory.CreateLogger("file");
        fileLogger.WriteLog("这是另一条测试日志");
    }
}

工厂方法模式的实现

简单工厂的缺点是当新增产品类型时,需要修改工厂类的判断逻辑,违反了开闭原则。工厂方法模式将工厂的创建逻辑下放到各个具体的工厂子类中,每个具体工厂只负责创建一种产品,新增产品时只需要新增对应的工厂类即可,不需要修改原有代码。

定义抽象工厂接口

首先定义抽象工厂接口,声明创建产品的方法:

// 抽象工厂接口
public interface ILoggerFactory
{
    // 创建日志对象的方法
    ILogger CreateLogger();
}

实现具体工厂类

为每种日志产品实现一个对应的具体工厂类:

// 控制台日志工厂
public class ConsoleLoggerFactory : ILoggerFactory
{
    public ILogger CreateLogger()
    {
        return new ConsoleLogger();
    }
}

// 文件日志工厂
public class FileLoggerFactory : ILoggerFactory
{
    public ILogger CreateLogger()
    {
        return new FileLogger();
    }
}

调用示例

调用方根据需要选择对应的工厂类来获取产品对象:

class Program
{
    static void Main(string[] args)
    {
        // 使用控制台日志工厂创建对象
        ILoggerFactory consoleFactory = new ConsoleLoggerFactory();
        ILogger consoleLogger = consoleFactory.CreateLogger();
        consoleLogger.WriteLog("工厂方法模式测试日志");

        // 使用文件日志工厂创建对象
        ILoggerFactory fileFactory = new FileLoggerFactory();
        ILogger fileLogger = fileFactory.CreateLogger();
        fileLogger.WriteLog("工厂方法模式另一测试日志");
    }
}

两种实现方式的对比

可以通过下面的表格对比两种工厂模式实现方式的差异:

对比维度简单工厂模式工厂方法模式
复杂度实现简单,只有一个工厂类实现相对复杂,需要多个工厂类
开闭原则新增产品需要修改工厂类,违反开闭原则新增产品只需要新增工厂类,符合开闭原则
适用场景产品类型少且变动少的场景产品类型多或者需要频繁扩展的场景

实现注意事项

在C#中实现工厂模式时需要注意几个问题:

  • 抽象产品接口的定义要尽量稳定,避免后续频繁修改接口导致所有具体产品都需要调整。
  • 如果产品对象创建过程比较复杂,比如需要读取配置、初始化依赖等,可以将这些逻辑放在工厂类中,调用方不需要关心创建细节。
  • 如果工厂创建的对象是单例的,可以在工厂类中维护对象的实例缓存,避免重复创建对象消耗资源。
工厂模式的核心是解耦对象的创建和使用,实际项目中不需要为了使用模式而使用模式,需要根据实际的业务复杂度和扩展需求选择合适的实现方式。

C#Factory_Pattern设计模式工厂模式修改时间:2026-06-10 13:27:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。