设计模式 - 工厂模式

概述

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪一个类,从而将对象的创建过程与使用过程分离。这种模式提高了代码的灵活性和可维护性,广泛应用于需要灵活创建对象的场景。

结构

工厂方法模式包含以下几个角色:

  1. 抽象产品(Product):定义了产品的接口。
  2. 具体产品(ConcreteProduct):实现了抽象产品接口的具体类。
  3. 抽象工厂(Creator):声明了工厂方法,返回一个抽象产品类型的对象。
  4. 具体工厂(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.");
    }
}

应用场景

工厂方法模式适用于以下场景:

  1. 当一个类不知道它所需要的对象的类时。
  2. 当一个类希望由其子类来指定创建对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化时。

优缺点

优点

  • 提高代码的灵活性:通过将对象的创建过程延迟到子类,工厂方法模式使得代码更加灵活和可扩展。
  • 降低耦合度:客户端代码不需要知道具体产品类的名称,只需要知道抽象产品接口,从而降低了代码的耦合度。

缺点

  • 增加代码复杂性:每增加一个具体产品类,就需要增加一个相应的具体工厂类,导致代码量增加。
posted @ 2025-01-03 16:00  贾光辉  阅读(25)  评论(2编辑  收藏  举报