C# 23种设计模式(3)工厂(SimpleFactory)模式

一、工厂模式介绍

工厂模式(Factory Pattern)是一种在软件开发中常用的创建型设计模式。它的主要目的是将对象的创建逻辑与使用逻辑分离,使得增加新的对象类型时不需要修改使用对象的代码。这样做提高了系统的可扩展性和可维护性。

工厂模式通常包含以下几个角色:

  1. 抽象产品(Product):定义了产品的接口,是工厂方法所创建的对象的父类或接口。
  2. 具体产品(Concrete Product):实现了抽象产品接口,不同的具体产品代表了不同的产品类。
  3. 抽象工厂(Factory):声明了工厂方法,用于返回一个产品。
  4. 具体工厂(Concrete Factory):实现了抽象工厂中定义的工厂方法,返回具体的产品实例。

工厂模式的用途:

  • 降低耦合:通过使用工厂模式,对象的创建不再依赖于具体的类,而是依赖于接口或抽象类,从而降低了客户程序与具体产品类之间的耦合。
  • 增强灵活性:当系统需要增加新的产品时,只需要增加一个新的具体产品类和对应的工厂类,不需要修改已有的代码。
  • 提高可维护性:因为对象的创建代码集中在一个地方,所以更容易维护和更新。

它解决了简单工厂模式在新增产品的类时,需要修改switch中的case项的问题。每增加一个新的产品类,就要改一次简单工厂类的代码,不符合面向对象设计的开放-封闭原则( 当新需求出现时,通过添加新代码来满足需求,而不是修改已有代码。

cs 复制代码
// 工厂类(无需修改,因为接口的变化没有影响到工厂类的创建逻辑)
public class SimpleFactory
{
    public static Product CreateProduct(string type)
    {
        Product product = null;
        switch (type)
        {
            case "A":
                product = new ConcreteProductA();
                break;
            case "B":
                product = new ConcreteProductB();
                break;
            default:
                throw new ArgumentException("Unknown product type");
        }
        return product;
    }
}

二、工厂模式代码实现

当有新产品时,只需要新写一个产品c的类 和 工厂c的类即可,不需要修改旧的函数。客户端代码通过调用具体工厂的 CreateProduct 方法来创建具体产品对象,而不需要知道具体的产品类。

cs 复制代码
// 抽象产品
public interface IProduct
{
    void Operation();
}

// 抽象工厂
public interface IFactory
{
    IProduct CreateProduct();
}

// 具体产品A
public class ProductA : IProduct
{
    public void Operation()
    {
        Console.WriteLine("操作来自ConcreteProductA");
    }
}
// 具体工厂A
public class FactoryA : IFactory
{
    public IProduct CreateProduct()
    {
        return new ProductA();
    }
}

// 具体产品B
public class ProductB : IProduct
{
    public void Operation()
    {
        Console.WriteLine("操作来自ConcreteProductB");
    }
}

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

// 客户端代码
public class Client
{
    public void start()
    {
        //通过具体产品工厂A、B生产,产品A、B可以传入以父类为参数的处理函数,并调用它自己的方法或属性
        Dostuff(new FactoryA().CreateProduct());
        Dostuff(new FactoryB().CreateProduct());
    }

    //一个程序通过product基类,执行多种产品的Operation()函数
    private void Dostuff(IProduct product)
    {
        product.Operation();
    }
}
相关推荐
掘根28 分钟前
【消息队列项目】客户端四大模块实现
开发语言·后端·ruby
钰fly5 小时前
C#类型转换 显隐转换
c#
疯狂的挖掘机6 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
cnxy1887 小时前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
意趣新7 小时前
C 语言源文件从编写完成到最终生成可执行文件的完整、详细过程
c语言·开发语言
李艺为8 小时前
根据apk包名动态修改Android品牌与型号
android·开发语言
黄河滴滴8 小时前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
老华带你飞8 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
superman超哥8 小时前
Rust Workspace 多项目管理:单体仓库的优雅组织
开发语言·rust·多项目管理·rust workspace·单体仓库
kylezhao20199 小时前
C#通过HSLCommunication库操作PLC用法
开发语言·c#