工厂模式

工厂模式(Factory Pattern)

介绍#

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但由子类决定实例化哪一个类。这样,工厂方法使一个类的实例化延迟到其子类。
包括简单工厂模式和工厂方法模式。

使用场景#

  1. 当一个类不知道它需要创建的对象的确切类型时。
  2. 当一个类希望由其子类来指定它创建的对象时。
  3. 当类的实例化过程需要被集中管理和控制时。

类图#

+--------------------+        +------------------+
|     Creator        |        |   ConcreteCreator|
+--------------------+        +------------------+
| + FactoryMethod()  |<-------| + FactoryMethod()|
+--------------------+        +------------------+
          ^                            ^
          |                            |
+--------------------+        +------------------+
|     Product        |        |   ConcreteProduct|
+--------------------+        +------------------+
|                    |        |                  |
+--------------------+        +------------------+

示例代码#

产品接口和具体产品类#

// 产品接口
public interface IProduct
{
    void Operation();
}

// 具体产品类 A
public class ConcreteProductA : IProduct
{
    public void Operation()
    {
        Console.WriteLine("Operation from ConcreteProductA");
    }
}

// 具体产品类 B
public class ConcreteProductB : IProduct
{
    public void Operation()
    {
        Console.WriteLine("Operation from ConcreteProductB");
    }
}

创建者类和具体创建者类#

// 创建者抽象类
public abstract class Creator
{
    // 工厂方法
    public abstract IProduct FactoryMethod();

    // 其他逻辑
    public void SomeOperation()
    {
        // 调用工厂方法创建产品
        IProduct product = FactoryMethod();
        // 使用产品
        product.Operation();
    }
}

// 具体创建者类 A
public class ConcreteCreatorA : Creator
{
    public override IProduct FactoryMethod()
    {
        return new ConcreteProductA();
    }
}

// 具体创建者类 B
public class ConcreteCreatorB : Creator
{
    public override IProduct FactoryMethod()
    {
        return new ConcreteProductB();
    }
}

客户端代码#

class Program
{
    static void Main(string[] args)
    {
        // 创建具体创建者A
        Creator creatorA = new ConcreteCreatorA();
        creatorA.SomeOperation();

        // 创建具体创建者B
        Creator creatorB = new ConcreteCreatorB();
        creatorB.SomeOperation();
    }
}

输出结果#

Operation from ConcreteProductA
Operation from ConcreteProductB

工厂模式和简单工厂的区别#

简单工厂模式#

简单工厂模式(Simple Factory Pattern)是一种创建型模式,它定义了一个工厂类,该类可以根据传入的参数,决定创建哪一种产品类的实例。简单工厂通常使用一个静态方法来创建对象。

简单工厂示例代码#

public interface IProduct
{
    void Operation();
}

public class ConcreteProductA : IProduct
{
    public void Operation()
    {
        Console.WriteLine("Operation from ConcreteProductA");
    }
}

public class ConcreteProductB : IProduct
{
    public void Operation()
    {
        Console.WriteLine("Operation from ConcreteProductB");
    }
}

public class SimpleFactory
{
    public static IProduct CreateProduct(string type)
    {
        switch (type)
        {
            case "A":
                return new ConcreteProductA();
            case "B":
                return new ConcreteProductB();
            default:
                throw new ArgumentException("Invalid type");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        IProduct productA = SimpleFactory.CreateProduct("A");
        productA.Operation();

        IProduct productB = SimpleFactory.CreateProduct("B");
        productB.Operation();
    }
}

区别#

  1. 设计意图

    • 简单工厂模式:通过一个静态方法,根据参数创建不同的产品对象。工厂类负责所有具体产品的创建逻辑。
    • 工厂方法模式:将创建对象的逻辑推迟到子类,由子类决定创建哪种具体产品。基类提供一个工厂方法,子类实现这个工厂方法。
  2. 类图结构

    • 简单工厂模式:有一个工厂类和多个具体产品类。
    • 工厂方法模式:有一个抽象创建者类、多个具体创建者类和多个具体产品类。
  3. 扩展性

    • 简单工厂模式:添加新产品需要修改工厂类,违反了开闭原则。
    • 工厂方法模式:添加新产品只需要添加新的具体创建者类和具体产品类,不需要修改现有代码,符合开闭原则。
  4. 职责分配

    • 简单工厂模式:工厂类承担了所有具体产品的创建职责。
    • 工厂方法模式:创建职责分散到不同的具体创建者类中。

选择使用#

  • 简单工厂模式适合产品种类较少且变化不频繁的场景。
  • 工厂方法模式适合产品种类较多且经常需要扩展的场景。

总结#

工厂模式和简单工厂模式都是创建型设计模式,它们都用来封装对象的创建过程,但在设计意图、扩展性和职责分配上有所不同。在上面的案例中:

  • 工厂模式,我们使用了工厂方法模式来实现对象创建,它将对象的创建逻辑推迟到子类,由子类决定创建哪种具体产品。符合了开闭原则(把逻辑判断放到了客户端来进行)。可以根据反射来避免分支判断。
  • 简单工厂模式,当我们要新增逻辑的时候需要修改工厂类,违反了开闭原则。

作者:zhuhy

出处:https://www.cnblogs.com/AILove/p/18219724

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   zhuhy  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示