首页 > 其他分享 >设计模式——工厂模式

设计模式——工厂模式

时间:2023-04-14 14:33:21浏览次数:34  
标签:对象 创建 模式 工厂 简单 设计模式 客户端

设计模式之工厂模式

简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于封装对象的创建逻辑。在简单工厂模式中,创建对象的逻辑被封装在一个工厂类中,而不是在客户端直接创建对象。

简单工厂模式的主要参与角色:

  1. 产品(Product):即要创建的对象,通常是一个接口或者抽象类,定义了对象的共同接口。

  2. 具体产品(Concrete Product):实现了产品接口的具体对象,由工厂类创建。

  3. 工厂(Factory):负责创建具体产品的工厂类,包含了对象的创建逻辑。根据客户端传入的参数或者条件,决定创建哪种具体产品的对象,并返回给客户端。

简单工厂模式的工作流程如下:

  1. 客户端通过调用工厂类的方法来创建对象,传入相应的参数或者条件。

  2. 工厂类根据传入的参数或者条件,决定创建哪种具体产品的对象。

  3. 工厂类创建具体产品的对象,并返回给客户端。

  4. 客户端通过返回的对象来使用创建好的产品。

简单工厂模式的优点包括:

  1. 将对象的创建逻辑封装在工厂类中,提供了一种集中管理和控制对象创建的方式,降低了代码的复杂度和维护成本。

  2. 客户端通过工厂类来创建对象,不需要直接依赖具体的对象类,从而降低了客户端与具体对象类之间的耦合度,提高了代码的灵活性。

  3. 工厂类可以根据传入的参数或者条件来决定创建哪种具体产品的对象,从而实现了对象的定制化创建。

简单工厂模式的缺点包括:

  1. 工厂类可能会变得比较复杂,包含了大量的创建逻辑,不符合开闭原则,难以扩展和维护。

  2. 当需要创建的产品类型较多时,工厂类的代码可能会变得很复杂和臃肿。

  3. 对象的创建逻辑集中在工厂类中,可能会导致工厂类的职责过重,不符合单一职责原则。

UML图

代码示例

#include <iostream>
using namespace std;

enum class TYPE {
    PRODUCT1,
    PRODUCT2,
    PRODUCT3
};

// 产品抽象类
class product {
public:
    virtual         ~product() {}
    virtual void    show() = 0;
};

class product1 : public product {
public:
    void    show() { cout << "I'm product1" << endl; }
};

class product2 : public product {
public:
    void    show() { cout << "I'm product2" << endl; }
};

class product3 : public product {
public:
    void    show() { cout << "I'm product3" << endl; }
};

class factory {
public:
    product* make(TYPE type) {
        product* res = nullptr;
        switch (type) {
        case TYPE::PRODUCT1:
            res = new product1();
            break;
        case TYPE::PRODUCT2:
            res = new product2();
            break;
        default:
            res = new product3();
        }
        return res;
    }
};

/*************测试********************/
#include "test.h"

int main()
{
    factory f;
    product* p = f.make(TYPE::PRODUCT1);
    p->show();
    return 0;
}

//输出
I'm product1

简单工厂模式的应用场景

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于创建对象的方式。它将对象的创建逻辑封装在一个工厂类中,通过传入不同的参数来创建不同的对象。简单工厂模式适用于以下场景:

  1. 对象的创建逻辑相对简单且不复杂:简单工厂模式适用于对象的创建逻辑比较简单,不涉及复杂的条件判断或者复杂的算法,只需要根据传入的参数进行简单的处理即可。

  2. 需要根据不同参数创建不同对象:简单工厂模式适用于根据不同的参数值创建不同类型的对象,例如在一个图形绘制软件中,可以根据传入的参数值创建不同形状的图形对象,如圆形、矩形、三角形等。

  3. 需要集中管理对象的创建逻辑:简单工厂模式适用于需要集中管理对象的创建逻辑,避免在多个地方散落着对象的创建代码,从而降低了代码的维护成本。

  4. 需要降低客户端与具体对象类之间的耦合度:简单工厂模式通过将对象的创建逻辑封装在工厂类中,使得客户端代码不直接依赖具体的对象类,从而降低了客户端与具体对象类之间的耦合度,使得客户端更加灵活。

  5. 需要对对象的创建进行扩展和修改:简单工厂模式适用于将来可能需要对对象的创建逻辑进行扩展或者修改的情况,例如需要增加新的对象类型时,只需要修改工厂类的代码而不需要修改客户端代码。

需要注意的是,简单工厂模式并不是一种标准的设计模式,它仅仅是一种简单的对象创建方式,其缺点是工厂类可能会变得比较复杂,不符合开闭原则。在一些复杂的场景中,可能需要考虑使用其他更为灵活和可扩展的创建型设计模式,如工厂方法模式或抽象工厂模式。

标签:对象,创建,模式,工厂,简单,设计模式,客户端
From: https://www.cnblogs.com/AngleLin/p/17318204.html

相关文章

  • 软件系统设计-2-策略模式
    1.策略模式引入:鸭子1.1.从SimUDuck应用程序开始我们需要添加功能使得鸭子可以飞简单的修改鸭子父类,我们可以发现这样子橡皮鸭也可以飞我们需要意识到不是所有的鸭子都会飞考虑继承我们总是可以像使用quack()方法一样在橡皮鸭中覆盖fly()方法…但是,当我们在程序中添加木制诱饵......
  • 78、混合模式—变亮组
    1、在抠图的时候,如果选择了【主体】进行快速抠图的话,那么可能有些地方是扣的不是很合心意的,就要用到钢笔工具重新来抠画,勾画完就按【Ctrl+回车】,然后右键【建立选区】—>【添加到选区】,就可以了......
  • Vue.js history模式与hash模式
    视频13.路由器的两种工作模式对于一个url来说,什么是hash值?——#及其后面的内容就是hash值。hash值不会包含在HTTP请求中,即:hash值不会带给服务器。hash模式:地址中永远带着#号,不美观。若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。兼容性较......
  • 多种调度模式下的光储电站经济性最优储能容量配置分析
    多种调度模式下的光储电站经济性最优储能容量配置分析摘要:代码主要做的是一个光储电站经济最优储能容量配置的问题,对光储电站中储能的容量进行优化,以实现经济效益的最大化。光储电站的调度模式选为联络线调整模式,目标函数中考虑了储能运行损耗费用,售电收益、考核成本等,约束则主......
  • 基于产消者模式的主动配电网能量共享机制
    基于产消者模式的主动配电网能量共享机制摘要:代码提出了一种基于产消者和家用储能设备的能源共享机制。首先,考虑家用储能设备的充放电效用以及产消者的生产和消费效用,建立了消费者的交易决策模型。然后,基于集中式社会福利最大化能量共享问题,通过交替方向乘法器(ADMM)算法构建了主......
  • VMware虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式
    VMware虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式https://blog.csdn.net/qq_39192827/article/details/85872025?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-85872025-blog-109900553.235%5Ev28%5Epc_re......
  • NAT模式详解(进阶篇)
    NAT模式详解(进阶篇)https://blog.csdn.net/qq_45300786/article/details/109900553?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-109900553-blog-108634985.235%5Ev28%5Epc_relevant_default&......
  • uniapp 使用cli模式,利用jenkins远程部署
    1、uniapp必须使用cli模式,如果是hbuliderx创建的,不支持2、jenkins配置需要publishoverssh插件和node插件,自行百度即可现在主要说说配置1)、系统管理-》系统配置中,找到publishoverssh 2          ......
  • 通过工业智能网关打造工厂MES数据采集专属物联网
    MES系统是一套制造业工厂内广泛应用的生产信息管理系统,能够为企业提供生产制造数据,从而更好的进行生产调度、设备管理、工艺改善以及数据分析等,具备良好的使用价值。工业现场存在多种工业设备和通信协议,对于MES系统的设备接入和数据采集造成一定难题。物通博联工业智能网关可以采集......
  • C # 9.0 的模式匹配
    voidM(objecto1,objecto2){vart=(o1,o2);if(tis(int,string)){}//testifo1isanintando2isastringswitch(o1){caseint:break;//testifo1isanintcaseSystem.String:break;//testifo1isastring}}关系模式 与常数值相......