工厂模式是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