设计模式初探----工厂模式

news/2024/10/30 11:29:59/

1、简单工厂模式

概念

主要用于创建对象。用一个工厂来根据输入的条件产生不同的类,然后根据不同类的虚函数得到不同的结果。

应用场景

适用于针对不同情况创建不同类时,只需传入工厂类的参数即可,无需了解具体实现方法。

  • 计算器中对于同样的输入,执行不同的操作:加、减、乘、除。

代码实例

#include <iostream>
#include <vector>
using namespace std;// Here is the product class
class Operation
{
public:int var1, var2;virtual double GetResult(){double res = 0;return res;}
};class Add_Operation : public Operation
{
public:virtual double GetResult(){return var1 + var2;}
};class Sub_Operation : public Operation
{
public:virtual double GetResult(){return var1 - var2;}
};class Mul_Operation : public Operation
{
public:virtual double GetResult(){return var1 * var2;}
};class Div_Operation : public Operation
{
public:virtual double GetResult(){return var1 / var2;}
};// Here is the Factory class
class Factory
{
public:static Operation *CreateProduct(char op){switch (op){case '+':return new Add_Operation();case '-':return new Sub_Operation();case '*':return new Mul_Operation();case '/':return new Div_Operation();default:return new Add_Operation();}}
};int main()
{int a, b;cin >> a >> b;Operation *p = Factory::CreateProduct('+');p->var1 = a;p->var2 = b;cout << p->GetResult() << endl;p = Factory::CreateProduct('*');p->var1 = a;p->var2 = b;cout << p->GetResult() << endl;return 0;
}

2、工厂方法模式

概念

修正了简单工厂模式中不遵守开放封闭原则。把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。

应用场景

  • 一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
  • 一个类通过其派生类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其派生类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,派生类对象将覆盖父类对象,从而使得系统更容易扩展。
  • 将创建对象的任务委托给多个工厂派生类中的某一个,客户端在使用时可以无须关心是哪一个工厂派生类创建产品派生类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

代码实例

#include <iostream>
#include <vector>
using namespace std;// Here is the product class
class Operation
{
public:int var1, var2;virtual double GetResult(){double res = 0;return res;}
};class Add_Operation : public Operation
{
public:virtual double GetResult(){return var1 + var2;}
};class Sub_Operation : public Operation
{
public:virtual double GetResult(){return var1 - var2;}
};class Mul_Operation : public Operation
{
public:virtual double GetResult(){return var1 * var2;}
};class Div_Operation : public Operation
{
public:virtual double GetResult(){return var1 / var2;}
};class Factory
{
public:virtual Operation *CreateProduct() = 0;
};class Add_Factory : public Factory
{
public:Operation *CreateProduct(){return new Add_Operation();}
};class Sub_Factory : public Factory
{
public:Operation *CreateProduct(){return new Sub_Operation();}
};class Mul_Factory : public Factory
{
public:Operation *CreateProduct(){return new Mul_Operation();}
};class Div_Factory : public Factory
{
public:Operation *CreateProduct(){return new Div_Operation();}
};int main()
{int a, b;cin >> a >> b;Add_Factory *p_fac = new Add_Factory();Operation *p_pro = p_fac->CreateProduct();p_pro->var1 = a;p_pro->var2 = b;cout << p_pro->GetResult() << endl;Mul_Factory *p_fac1 = new Mul_Factory();Operation *p_pro1 = p_fac1->CreateProduct();p_pro1->var1 = a;p_pro1->var2 = b;cout << p_pro1->GetResult() << endl;return 0;
}

3、抽象工厂模式

概念

定义了一个创建一系列相关或相互依赖的接口,而无需指定他们的具体类。
在简单工厂模式和工厂方法模式中,一个工厂簇只能创建一类产品;当要新增产品类时,则需要新增工厂簇。在抽象工厂中,一个工厂簇能创建多个产品类;当要新增产品类时,只需新增对应的产品创建方法即可。

应用场景

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

代码实例

#include <iostream>
#include <vector>
using namespace std;// Here is the product class
class Operation_Pos
{
public:int var1, var2;virtual double GetResult(){double res = 0;return res;}
};class Add_Operation_Pos : public Operation_Pos
{
public:virtual double GetResult(){return var1 + var2;}
};class Sub_Operation_Pos : public Operation_Pos
{
public:virtual double GetResult(){return var1 - var2;}
};class Mul_Operation_Pos : public Operation_Pos
{
public:virtual double GetResult(){return var1 * var2;}
};class Div_Operation_Pos : public Operation_Pos
{
public:virtual double GetResult(){return var1 / var2;}
};
/*********************************************************************************/
class Operation_Neg
{
public:int var1, var2;virtual double GetResult(){double res = 0;return res;}
};class Add_Operation_Neg : public Operation_Neg
{
public:virtual double GetResult(){return -(var1 + var2);}
};class Sub_Operation_Neg : public Operation_Neg
{
public:virtual double GetResult(){return -(var1 - var2);}
};class Mul_Operation_Neg : public Operation_Neg
{
public:virtual double GetResult(){return -(var1 * var2);}
};class Div_Operation_Neg : public Operation_Neg
{
public:virtual double GetResult(){return -(var1 / var2);}
};
/*****************************************************************************************************/// Here is the Factory class
class Factory
{
public:virtual Operation_Pos *CreateProduct_Pos() = 0;virtual Operation_Neg *CreateProduct_Neg() = 0;
};class Add_Factory : public Factory
{
public:Operation_Pos *CreateProduct_Pos(){return new Add_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Add_Operation_Neg();}
};class Sub_Factory : public Factory
{
public:Operation_Pos *CreateProduct_Pos(){return new Sub_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Sub_Operation_Neg();}
};class Mul_Factory : public Factory
{
public:Operation_Pos *CreateProduct_Pos(){return new Mul_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Mul_Operation_Neg();}
};class Div_Factory : public Factory
{
public:Operation_Pos *CreateProduct_Pos(){return new Div_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Div_Operation_Neg();}
};int main()
{int a, b;cin >> a >> b;Add_Factory *p_fac = new Add_Factory();Operation_Pos *p_pro = p_fac->CreateProduct_Pos();p_pro->var1 = a;p_pro->var2 = b;cout << p_pro->GetResult() << endl;Add_Factory *p_fac1 = new Add_Factory();Operation_Neg *p_pro1 = p_fac1->CreateProduct_Neg();p_pro1->var1 = a;p_pro1->var2 = b;cout << p_pro1->GetResult() << endl;return 0;
}

http://www.ppmy.cn/news/78504.html

相关文章

springboot线程的用法以及配置详解

在 Spring Boot 中使用注解设置多线程&#xff0c;一般需要借助 Async 注解和 ThreadPoolTaskExecutor 类。 首先&#xff0c;需要在 Spring Boot 应用程序的主类上添加 EnableAsync 注解&#xff0c;该注解表示开启异步执行。 java SpringBootApplication EnableAsync publi…

Spring框架

Spring框架 版本历史核心功能模块控制反转容器&#xff08;依赖注入&#xff09;面向切面程序设计数据访问&#xff08;DAO层支持&#xff09;事务管理模型-视图-控制器&#xff08;MVC&#xff09;远程访问“约定大于配置”的快速应用开发 批处理相关链接参考资料 Spring框架…

【Leetcode hot 100】96. 不同的二叉搜索树

题目链接 思路 动态规划 题目是给定一个有序序列1,2,3…n, 我们需要求出一共有多少种构建二叉搜索树的方法。可以这样考虑&#xff1a;对每一个数字i&#xff0c;我们遍历它&#xff0c;以i为根节点&#xff0c;1…(i-1)为左子树&#xff0c;i1…n为右子树&#xff0c;接着我…

LeetCode——矩阵中移动的最大次数

目录 1、题目 2、题目解读 3、代码 1、题目 2684. 矩阵中移动的最大次数 - 力扣&#xff08;Leetcode&#xff09; 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整数组成。 你可以从矩阵第一列中的 任一 单元格出发&#xff0c;按以下方式遍…

【HackTheBox Bagel】打靶记录

一、namp扫描到5000 8000 22 端口 二、访问8000端口&#xff0c;看到跳转到域名bagel.htb&#xff0c;加入到hosts 看到该url 像文件包含&#xff0c;尝试fuzz一波 尝试找公私钥均未果&#xff0c;找到了cmdline 进一步对其包含 HTTP/1.1 200 OK Server: Werkzeug/2.2.2 …

How to use RestTemplate in Spring boot, part II

How to use RestTemplate in Spring boot, part II Consumer ServicepomControllerBusinessConsumerBusinessConsumerBusinessImpl ResultMaoResultMaoResultCode Request Configapplication.ymlJurongConfigknife4jConfig Summary 考虑到篇幅问题&#xff0c;这里将一篇文章切…

Smartbi电子表格故事之用数据进行销售问题分析

天津小麦商贸有限公司&#xff08;X&M&#xff09;成立于2012年11月&#xff0c;主营业务是商贸流通业&#xff0c;主要是日用商品的批发销售。 2012年前&#xff0c;公司创始人&#xff08;总经理和销售总监&#xff09;一直从事外贸的生意&#xff0c;自从2008年金融危机…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(序章——浅谈单片机以及FreeRTOS)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…