工厂模式
- 模式介绍:将对象的创建过程封装在工厂类中,客户端代码只需要关心从工厂获取对象的过程,而不需要了解对象的创建细节。这样做的好处包括提高了代码的灵活性和可扩展性,降低了对象之间的耦合度。
- 主要解决接口选择的问题。当我们需要在不同条件下创建不同实例时。通过让子类实现工厂接口,返回一个抽象的产品。
- 关键代码:对象的创建过程在子类中实现。
工厂模式的分类
工厂模式通常分为三种类型:简单工厂模式(静态工厂模式)、工厂方法模式和抽象工厂模式。
- 简单工厂模式(Simple Factory Pattern)
1)定义:简单工厂模式又称静态工厂方法模式,它由一个工厂类根据传入的参数决定创建哪一种产品类的实例。
2)优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品。
3)缺点:工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都要受到影响;系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。 - 工厂方法模式(Factory Method Pattern)
1)定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。
2)优点:客户端不需要在代码中指定具体产品的类,只需要使用共同接口来操作实例;符合开闭原则,可以在不修改原有系统代码的情况下扩展新的产品类。
3)缺点:每增加一个产品,就需要增加一个具体工厂类,增加了系统的复杂度。 - 抽象工厂模式(Abstract Factory Pattern)
1)定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
2)优点:可以在类的内部对产品族进行约束,使得产品族内的产品可以替换;增加新的产品族很方便,只需增加一个新的工厂类,符合开闭原则。
3)缺点:难以支持新种类的产品,因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品种类,则需要对接口进行扩展,这会影响到已有的系统结构。
应用场景
- 数据库连接:为不同的数据库类型创建具体的工厂类,实现相应的数据库连接方法。
- UI控件:为不同的UI控件类型创建具体的工厂类,实现相应的控件创建方法。
- 文件处理:为不同的文件类型创建具体的工厂类,实现相应的文件处理方法。
- 日志记录:为不同的日志类型创建具体的工厂类,实现相应的日志记录方法。
- 网络通信:为不同的网络协议类型创建具体的工厂类,实现相应的网络通信方法。
- 消息队列:为不同的消息队列类型创建具体的工厂类,实现相应的消息队列处理方法。
- 数据结构:为不同的数据结构类型创建具体的工厂类,实现相应的数据结构操作方法。
- 加密解密:为不同的加密解密算法类型创建具体的工厂类,实现相应的加密解密方法。
- 消息推送:为不同的消息推送服务类型创建具体的工厂类,实现相应的推送方法。
- 任务调度:为不同的任务调度服务类型创建具体的工厂类,实现相应的调度方法。
代码实现(AI Code)
一、简单工厂模式
/// <summary>
/// 日志记录器的接口
/// </summary>
public interface ILogger
{
void Log(string message);
}
/// <summary>
/// ConsoleLogger实现日志记录器的接口
/// </summary>
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"ConsoleLogger: {message}");
}
}
/// <summary>
/// FileLogger实现日志记录器的接口
/// </summary>
public class FileLogger : ILogger
{
private string filePath;
public FileLogger(string filePath)
{
this.filePath = filePath;
}
public void Log(string message)
{
// 这里简单模拟写入文件
Console.WriteLine($"FileLogger ({filePath}): {message}");
// 实际使用中,你可能需要在这里写文件
}
}
/// <summary>
/// 日志记录器工厂
/// </summary>
public class LoggerFactory
{
public static ILogger CreateLogger(string type)
{
switch (type)
{
case "console":
return new ConsoleLogger();
case "file":
// 假设我们默认日志路径为"app.log"
return new FileLogger("app.log");
default:
throw new ArgumentException("Invalid logger type");
}
}
}
class Program
{
static void Main(string[] args)
{
ILogger logger1 = LoggerFactory.CreateLogger("console");
logger1.Log("This is a console log.");
ILogger logger2 = LoggerFactory.CreateLogger("file");
logger2.Log("This is a file log.");
// 如果尝试创建一个不存在的日志类型,将抛出异常
// ILogger logger3 = LoggerFactory.CreateLogger("unknown");
// logger3.Log("This will not work.");
}
}
二、工厂模式
// 日志记录器接口
public interface ILogger
{
void Log(string message);
}
// 控制台日志记录器
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Console: {message}");
}
}
// 文件日志记录器
public class FileLogger : ILogger
{
private readonly string filePath;
public FileLogger(string filePath)
{
this.filePath = filePath;
}
public void Log(string message)
{
// 假设只是打印到控制台,实际应写入文件
Console.WriteLine($"File ({filePath}): {message}");
}
}
// 日志工厂基类
public abstract class LoggerFactory
{
// 工厂方法
public abstract ILogger CreateLogger();
}
// 控制台日志工厂
public class ConsoleLoggerFactory : LoggerFactory
{
public override ILogger CreateLogger()
{
return new ConsoleLogger();
}
}
// 文件日志工厂
public class FileLoggerFactory : LoggerFactory
{
private readonly string filePath;
public FileLoggerFactory(string filePath)
{
this.filePath = filePath;
}
public override ILogger CreateLogger()
{
return new FileLogger(filePath);
}
}
// 使用示例
class Program
{
static void Main(string[] args)
{
LoggerFactory consoleFactory = new ConsoleLoggerFactory();
ILogger consoleLogger = consoleFactory.CreateLogger();
consoleLogger.Log("This is a console log.");
LoggerFactory fileFactory = new FileLoggerFactory("app.log");
ILogger fileLogger = fileFactory.CreateLogger();
fileLogger.Log("This is a file log.");
}
}
三、抽象工厂模式
- 定义产品接口
/ 日志记录器接口
public interface ILogger
{
void Log(string message);
}
// 日志级别管理器接口(这里不实现具体类,仅作为示例)
public interface ILogLevelManager
{
// 可能包含设置日志级别、获取当前日志级别等方法
}
- 创建具体产品类
// 控制台日志记录器
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Console: {message}");
}
}
// 文件日志记录器
public class FileLogger : ILogger
{
private readonly string filePath;
public FileLogger(string filePath)
{
this.filePath = filePath;
}
public void Log(string message)
{
// 假设只是打印到控制台,实际应写入文件
Console.WriteLine($"File ({filePath}): {message}");
}
}
- 定义抽象工厂接口
// 抽象工厂接口
public interface ILoggingFactory
{
ILogger CreateLogger();
// 如果需要,可以添加ILogLevelManager CreateLogLevelManager();
}
- 创建具体工厂类
// 控制台日志工厂
public class ConsoleLoggingFactory : ILoggingFactory
{
public ILogger CreateLogger()
{
return new ConsoleLogger();
}
// 如果需要日志级别管理器,则在这里实现
// public ILogLevelManager CreateLogLevelManager() { ... }
}
// 文件日志工厂
public class FileLoggingFactory : ILoggingFactory
{
private readonly string filePath;
public FileLoggingFactory(string filePath)
{
this.filePath = filePath;
}
public ILogger CreateLogger()
{
return new FileLogger(filePath);
}
// 如果需要日志级别管理器,则在这里实现,并可能依赖filePath
// public ILogLevelManager CreateLogLevelManager() { ... }
}
- 使用抽象工厂
class Program
{
static void Main(string[] args)
{
ILoggingFactory consoleFactory = new ConsoleLoggingFactory();
ILogger consoleLogger = consoleFactory.CreateLogger();
consoleLogger.Log("This is a console log.");
ILoggingFactory fileFactory = new FileLoggingFactory("app.log");
ILogger fileLogger = fileFactory.CreateLogger();
fileLogger.Log("This is a file log.");
}
}