23种设计模式之《工厂方法模式(Factory Method)》在c#中的应用及理解

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但将具体的对象创建延迟到子类中。换句话说,工厂方法模式让子类决定实例化哪个类。

核心思想
  1. 抽象工厂接口

    定义一个接口(或抽象类),其中包含一个创建对象的方法(例如 CreateProduct)。这个方法的具体实现由子类完成。

  2. 具体工厂类

    每个具体工厂类负责创建一种具体的产品。例如,FactoryA 创建 ProductAFactoryB 创建 ProductB

  3. 产品接口

    定义一个产品接口,所有具体产品都需要实现这个接口。客户端代码通过产品接口与具体产品交互,而不需要知道具体产品的类名。

  4. 解耦

    客户端代码只需要知道工厂接口和产品接口,而不需要关心具体的产品类和工厂类。这样可以将对象的创建与使用分离,提高代码的灵活性和可维护性。

适用场景
  • 当系统需要支持多种产品类型,并且未来可能会增加新的产品类型时。

  • 当对象的创建过程复杂或需要解耦时。

  • 当客户端代码需要根据条件创建不同的对象时。

优点
  • 符合开闭原则,易于扩展。

  • 客户端代码与具体产品解耦,提高了代码的灵活性。

缺点
  • 每增加一个产品,就需要增加一个具体工厂类,可能会导致类的数量增加。

工厂方法模式的C#代码示例

下面是一个使用C#实现的工厂方法模式示例代码,并附有详细的文字说明。

代码实现

csharp

cs 复制代码
using System;

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

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

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

// 工厂接口
public interface IFactory
{
    IProduct CreateProduct();
}

// 具体工厂A,用于创建ProductA
public class FactoryA : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

// 具体工厂B,用于创建ProductB
public class FactoryB : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductB();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建工厂A并生产产品A
        IFactory factoryA = new FactoryA();
        IProduct productA = factoryA.CreateProduct();
        productA.Operation();

        // 创建工厂B并生产产品B
        IFactory factoryB = new FactoryB();
        IProduct productB = factoryB.CreateProduct();
        productB.Operation();
    }
}

代码说明

  1. 产品接口 IProduct

    • 定义了一个 Operation 方法,所有具体产品都需要实现这个接口。

    • 这是工厂方法模式的核心,确保所有产品具有统一的接口。

  2. 具体产品 ProductAProductB

    • ProductAProductB 是实现了 IProduct 接口的具体产品类。

    • 每个产品类都有自己的 Operation 实现。

  3. 工厂接口 IFactory

    • 定义了一个 CreateProduct 方法,用于创建产品。

    • 所有具体工厂都需要实现这个接口。

  4. 具体工厂 FactoryAFactoryB

    • FactoryA 负责创建 ProductAFactoryB 负责创建 ProductB

    • 每个工厂类都实现了 IFactory 接口,并在 CreateProduct 方法中返回具体的产品实例。

  5. 主程序验证

    • Main 方法中,分别创建 FactoryAFactoryB 的实例。

    • 通过工厂的 CreateProduct 方法创建产品,并调用产品的 Operation 方法。

    • 输出结果验证了工厂方法模式的正确性。


输出结果

运行上述代码后,输出如下:

cs 复制代码
ProductA operation.
ProductB operation.

工厂方法模式的扩展性

如果需要增加新的产品类型,只需要增加一个新的具体产品类和对应的具体工厂类,而不需要修改现有代码。例如:

csharp

cs 复制代码
// 新增具体产品C
public class ProductC : IProduct
{
    public void Operation()
    {
        Console.WriteLine("ProductC operation.");
    }
}

// 新增具体工厂C
public class FactoryC : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductC();
    }
}

然后在 Main 方法中使用新的工厂:

csharp

cs 复制代码
IFactory factoryC = new FactoryC();
IProduct productC = factoryC.CreateProduct();
productC.Operation();

输出结果:

cs 复制代码
ProductC operation.

总结

工厂方法模式通过将对象的创建与使用分离,提高了代码的灵活性和可维护性。它符合开闭原则,易于扩展,适用于需要支持多种产品类型的场景。

相关推荐
时光追逐者43 分钟前
推荐几款开源免费的 .NET MAUI 组件库
microsoft·开源·c#·.net·.net core·maui
YXWik61 小时前
23种设计模式
java·设计模式
攻城狮7号1 小时前
【第三节】C++设计模式(创建型模式)-单例模式
c++·单例模式·设计模式
软件黑马王子3 小时前
C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合
开发语言·c#
shepherd枸杞泡茶3 小时前
第3章 3.2 配置系统 .NET Core配置系统
后端·c#·asp.net·.net
zh路西法3 小时前
【C++委托与事件】函数指针,回调机制,事件式编程与松耦合的设计模式(上)
开发语言·c++·观察者模式·设计模式
ox00803 小时前
C++ 设计模式-备忘录模式
c++·设计模式·备忘录模式
強云3 小时前
23种设计模式 - 备忘录模式
设计模式·备忘录模式
编程乐趣4 小时前
一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
开发语言·c#
我是苏苏5 小时前
C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)
开发语言·c#·linq