工厂方法模式

31 阅读5分钟

1.概念

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式的主要参与角色包括:

  • 定义抽象产品接口(Product):抽象产品接口定义了产品对象的共同行为,包括一组方法或属性。具体的产品类将实现该接口。
  • 创建具体产品类(Concrete Product):具体产品类实现了抽象产品接口,提供了具体的实现细节。每个具体产品类对应一种具体的产品。
  • 定义抽象工厂接口(Factory):抽象工厂接口声明了创建产品对象的抽象方法,该方法返回抽象产品类型。具体的工厂类将实现该接口。
  • 创建具体工厂类(Concrete Factory):具体工厂类实现了抽象工厂接口,并负责创建具体的产品对象。每个具体工厂类对应创建一种具体的产品
  • 客户端使用工厂类创建产品对象:在客户端代码中,通过调用工厂类的创建方法来获取产品对象。客户端代码不需要直接与具体的产品类耦合,而是通过工厂类来创建和使用产品对象。

2.结构图

image.png

3.示例代码

class Program
{
    static void Main(string[] args)
    {
        ShapeFactory factory;

        factory = new CircleFactory();
        var circle = factory.CreateShape();
        circle.Draw();

        factory = new TriangleFactory();
        var triangle = factory.CreateShape();
        triangle.Draw();
    }
}
// 形状接口
interface Shape
{
    public void Draw();
}
// 具体形状,圆形
class Circle : Shape
{
    public void Draw()
    {
        Console.WriteLine("画圆形");
    }
}
class Rectangle : Shape
{
    public void Draw()
    {
        Console.WriteLine("画矩形");
    }
}
class Triangle : Shape
{
    public void Draw()
    {
        Console.WriteLine("画三角形");
    }
}
// 形状工厂接口
interface ShapeFactory
{
    Shape CreateShape();
}
// 具体形状工厂,圆形
class CircleFactory : ShapeFactory
{
    public Shape CreateShape()
    {
        return new Circle();
    }
}
class TriangleFactory : ShapeFactory
{
    public Shape CreateShape()
    {
        return new Triangle();
    }
}
class RectangleFactory : ShapeFactory
{
    public Shape CreateShape()
    {
        return new Rectangle();
    }
}

4.工厂方法模式优点

  1. 解耦客户端和具体产品类:工厂方法模式通过引入抽象工厂接口和具体工厂类,将客户端代码与具体产品的创建解耦。客户端只需要依赖于抽象工厂接口,而不需要直接依赖于具体产品类。这样可以减少客户端代码与具体产品类之间的耦合,提高代码的灵活性和可维护性。
  2. 符合开闭原则:工厂方法模式符合开闭原则,即对扩展开放、对修改关闭。当需要新增一种产品时,只需新增对应的具体产品类和具体工厂类,而不需要修改现有的代码。这样可以保持系统的稳定性,并方便地扩展新的产品和工厂类。
  3. 提供灵活的扩展机制:工厂方法模式提供了一种灵活的扩展机制,允许在运行时动态决定使用哪个具体工厂类来创建产品对象。这样可以根据不同的需求或条件,动态地切换产品的创建逻辑,增加系统的灵活性。
  4. 支持单一职责原则:工厂方法模式将对象的创建过程封装在工厂类中,使得每个工厂类只负责创建一种具体产品。这符合单一职责原则,每个类都有清晰的职责和任务,提高了代码的可读性和可维护性。
  5. 可以通过子类定制创建逻辑:工厂方法模式允许通过子类来定制创建产品的逻辑。每个具体工厂类可以根据具体的需求重写工厂方法,以创建不同的产品对象。这样可以在一定程度上个性化定制产品的创建过程。

5.工厂方法模式实际应用

  1. 日志记录器(Logger):在应用程序中,可以使用工厂方法模式创建不同类型的日志记录器,如文件日志记录器、数据库日志记录器或控制台日志记录器。每个日志记录器都实现了抽象日志记录器接口,并通过对应的工厂类进行创建。
  2. 数据库访问对象(DAO):在数据访问层中,可以使用工厂方法模式创建不同类型的数据库访问对象,如MySQLDAO、OracleDAO或SQLServerDAO。每个数据库访问对象都实现了抽象DAO接口,并通过对应的工厂类进行创建。
  3. 加密算法(Encryption):在加密领域中,可以使用工厂方法模式创建不同类型的加密算法对象,如AES加密、DES加密或RSA加密。每个加密算法都实现了抽象加密算法接口,并通过对应的工厂类进行创建。
  4. 网络请求(HTTP Request):在网络通信中,可以使用工厂方法模式创建不同类型的网络请求对象,如HTTP请求、FTP请求或WebSocket请求。每个网络请求对象都实现了抽象请求接口,并通过对应的工厂类进行创建。
  5. 消息队列(Message Queue):在消息系统中,可以使用工厂方法模式创建不同类型的消息队列对象,如RabbitMQ队列、ActiveMQ队列或Kafka队列。每个消息队列对象都实现了抽象队列接口,并通过对应的工厂类进行创建。