当前位置: 首页 > backend >正文

C++:设计模式--工厂模式


更多内容:XiaoJ的知识星球


目录

  • 1.简单工厂模式
    • 1.1 简单工厂
    • 1.2 实现步骤
    • 1.3 实现代码
    • 1.4 优缺点
  • 2.工厂模式
    • 2.1 工厂模式
    • 2.2 实现步骤
    • 2.3 实现代码
    • 2.4 优缺点
  • 3.抽象工厂模式
    • 3.1 抽象工厂模式
    • 3.2 实现步骤
    • 3.3 实现代码
    • 3.4 优缺点


1.简单工厂模式

.

1.1 简单工厂

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式

通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

.

1.2 实现步骤

1.提供一个工厂类

  • 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.提供一个抽象产品类

  • 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.提供一个具体产品类

  • 简单工厂模式所创建的具体实例对象

在这里插入图片描述

.

1.3 实现代码

#include <iostream>
#include <string>
using namespace std;
//产品抽象父类
class Operation 
{    public:double m_leftVlaue;double m_rightValue;virtual double GetResult() = 0;
};
//具体产品实现类
class AddOperation:public Operation
{double GetResult(){return m_leftVlaue + m_rightValue;}
};
class SubOperation :public Operation 
{double GetResult(){return m_leftVlaue - m_rightValue;}
};class MulOperation :public Operation
{double GetResult(){return m_leftVlaue * m_rightValue;}
};class DivOperation :public Operation
{double GetResult(){return m_leftVlaue / m_rightValue;}
};
//工厂类
class  OperatorFactory 
{
public:static  Operation* createOperation(char c) {switch (c) {case '+':return new AddOperation;break;case '-':return new SubOperation;break;case '*':return new MulOperation;break;case '/':return new DivOperation;break;}}
};
int main() 
{Operation* operation = OperatorFactory::createOperation('+');operation->m_leftVlaue = 1;operation->m_rightValue = 2;cout << operation->GetResult() << endl;return 0;
}

1.4 优缺点

优点

  • 帮助封装:实现组件封装,面向接口编程

  • 解耦合:客户端和具体实现类的解耦合

缺点

  • 可能增加客户端的复杂度

  • 不方便扩展子工厂

.


2.工厂模式

2.1 工厂模式

工厂方法模式,同样属于类的创建型模式,又被称为多态工厂模式 。

工厂方法模式的意义:

  • 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

  • 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,

  • 这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工 厂角色的情况下引进新的产品

.

2.2 实现步骤

1.提供一个抽象工厂类 :所有具体工厂类的父类

2.提供与产品对应的工厂类:负责实例化产品对象

3.提供一个抽象产品类:所有产品的父类

4.提供一个或多个产品类:工厂方法模式所创建的具体实例对象
在这里插入图片描述
.

2.3 实现代码

#include <iostream>
using namespace std;
class AbstractProduct
{
public:virtual void makeProduct() = 0;
};class AbstractFactory 
{
public:virtual AbstractProduct* createProduct() = 0;
};class PlaneProduct :public AbstractProduct
{
public:void makeProduct() {cout << "造飞机....." << endl;}
};
class PlaneFactory :public AbstractFactory 
{
public:AbstractProduct* createProduct(){AbstractProduct* product = new PlaneProduct;return product;}
};
class RocketProduct :public AbstractProduct
{
public:void makeProduct(){cout << "造火箭...." << endl;}
};
class RocketFactory :public AbstractFactory 
{
public :AbstractProduct* createProduct(){AbstractProduct* product = new RocketProduct;return product;}
};int main() 
{//造飞机AbstractFactory* factory = new PlaneFactory;AbstractProduct* product = factory->createProduct();product->makeProduct();//造火箭factory = new RocketFactory;product = factory->createProduct();product->makeProduct();return 0;
}

.

2.4 优缺点

优点

  • 需求改变时改动最小

  • 具体的创建实例过程与客户端分离

缺点:

  • 新增功能时,工程量稍大

.


3.抽象工厂模式

3.1 抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

.

3.2 实现步骤

1.提供一个抽象工厂类:声明一组创建一族产品的工厂方法

2.提供一个具体工厂类:实现了在抽象工厂创建产品的工厂方法

3.提供一个抽象产品类:抽象产品中声明了产品具有的业务方法

4.提供一个具体产品类:实现抽象产品接口中声明的业务方法
在这里插入图片描述

.

3.3 实现代码

#include <iostream>
using namespace std;
//抽象产品
class Product 
{
public:virtual void show() = 0;
};
//抽象产品族1
class KeyBoard :public Product{};
//罗技键盘
class LogiKeyBoard :public KeyBoard
{void show(){cout << "罗技键盘......" << endl;}
};
//雷蛇键盘
class RazerKeyBoard :public KeyBoard
{void show() {cout << "雷蛇键盘......" << endl;}
};
//抽象产品族2
class Mouse :public Product {};
//罗技鼠标
class LogiMouse :public Mouse
{void show() {cout << "罗技鼠标......" << endl;}
};
class RazerMouse :public Mouse 
{void show() {cout << "雷蛇鼠标......" << endl;}
};
//抽象工厂
class Factory
{
public:virtual KeyBoard* createKeyBoard() = 0;virtual Mouse* createMouse() = 0;
};
class LogiFactory :public Factory
{KeyBoard* createKeyBoard(){return new LogiKeyBoard;}Mouse* createMouse() {return new LogiMouse;}
};
class RazerFactory :public Factory 
{KeyBoard* createKeyBoard() {return new RazerKeyBoard;}Mouse* createMouse() {return new RazerMouse;}
};int main() 
{Factory* factory = new LogiFactory;KeyBoard* keyBoard = factory->createKeyBoard();Mouse* mouse = factory->createMouse();keyBoard->show();mouse->show();delete factory;delete keyBoard;delete mouse;factory = new RazerFactory;keyBoard = factory->createKeyBoard();mouse = factory->createMouse();keyBoard->show();mouse->show();delete factory;delete keyBoard;delete mouse;factory = NULL;keyBoard = NULL;mouse = NULL;return 0;
}

.

3.4 优缺点

优点

  • 抽象工厂封装了变化,封装了对象创建的具体细节

  • 增加新的产品族很方便,无须修改已有系统

  • 针对接口进行编程而不是针对具体进行编程

缺点:

  • 增加新的产品等级结构需对原系统做较大修改(违背开放封闭)

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

http://www.xdnf.cn/news/9212.html

相关文章:

  • linux安装MYSQL
  • 图论学习笔记 5 - 最小树形图
  • leetcode hot100刷题日记——22.只出现一次的数字
  • Python安装、pycharm配置和添加库下载
  • 投影机光源三代发展史:从高压汞灯、白光 LED 到三色光源
  • 基于51单片机的音乐盒点阵屏proteus仿真
  • 智能手表单元测试报告(Unit Test Report)
  • (自用)Java学习-5.19(地址管理,三级联动,预支付)
  • LINUX安装运行jeelowcode后端项目(idea启动)
  • C++23:关键特性与最新进展深度解析
  • Linux --进度条小程序更新
  • 深度解析:如何利用 Docker 容器化 Python 应用,并解决容器间的网络与存储问题
  • 嵌入式高级工程师面试全解:从 malloc 到 kernel panic 的系统知识梳理
  • JSON解析性能优化全攻略:协程调度器选择与线程池饥饿解决方案
  • 相交链表(力扣160 easy)
  • 蓝凌EKP平台表单控件升级:一行配置引入LayUI新UI体验
  • React useEffect和useEffectLa
  • 从核心数据透视吹风机行业:用户需求演变与产品创新图谱
  • Redis 集合、有序集合与通用命令详解
  • 实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.6 R语言解题
  • HTML5 全面知识点总结
  • Point-wise vs Pair-wise vs List-wise 简述
  • 系统开发和运行知识
  • 什么场景下能够用到根据id批量查询用户
  • sockaddr_in
  • 08_预处理与缩放
  • 关于 smali:1. Smali 基础语法入门
  • 一款不错的嵌入式开发自动化测试平台
  • Trivy 镜像漏洞扫描:从零入门到实战指南
  • java基础(面向对象进阶高级)泛型(API一)