设计模式 - 工厂模式
概述
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪一个类,从而将对象的创建过程与使用过程分离。这种模式提高了代码的灵活性和可维护性,广泛应用于需要灵活创建对象的场景。
结构
工厂方法模式包含以下几个角色:
- 抽象产品(Product):定义了产品的接口。
- 具体产品(ConcreteProduct):实现了抽象产品接口的具体类。
- 抽象工厂(Creator):声明了工厂方法,返回一个抽象产品类型的对象。
- 具体工厂(ConcreteCreator):实现了工厂方法,返回具体产品的实例。
示例代码
假设我们有一个应用程序需要创建不同类型的日志记录器(如文件日志记录器和数据库日志记录器)
代码地址
抽象产品
public interface ILogger
{
void Log(string message);
}
具体产品
public class FileLogger : ILogger
{
public void Log(string message)
{
// 将日志写入文件
Console.WriteLine($"FileLogger: {message}");
}
}
public class DatabaseLogger : ILogger
{
public void Log(string message)
{
// 将日志写入数据库
Console.WriteLine($"DatabaseLogger: {message}");
}
}
抽象工厂
public abstract class LoggerFactory
{
public abstract ILogger CreateLogger();
}
具体工厂
public class FileLoggerFactory : LoggerFactory
{
public override ILogger CreateLogger()
{
return new FileLogger();
}
}
public class DatabaseLoggerFactory : LoggerFactory
{
public override ILogger CreateLogger()
{
return new DatabaseLogger();
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
LoggerFactory factory;
ILogger logger;
// 创建文件日志记录器
factory = new FileLoggerFactory();
logger = factory.CreateLogger();
logger.Log("This is a file log message.");
// 创建数据库日志记录器
factory = new DatabaseLoggerFactory();
logger = factory.CreateLogger();
logger.Log("This is a database log message.");
}
}
应用场景
工厂方法模式适用于以下场景:
- 当一个类不知道它所需要的对象的类时。
- 当一个类希望由其子类来指定创建对象时。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化时。
优缺点
优点
- 提高代码的灵活性:通过将对象的创建过程延迟到子类,工厂方法模式使得代码更加灵活和可扩展。
- 降低耦合度:客户端代码不需要知道具体产品类的名称,只需要知道抽象产品接口,从而降低了代码的耦合度。
缺点
- 增加代码复杂性:每增加一个具体产品类,就需要增加一个相应的具体工厂类,导致代码量增加。