自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)

使用工厂模式来生产某类对象(代码简化且容易维护,类之间有血缘关系,可以通过工厂类进行生产);

简单工厂模式(用于创建简单对象)

对于简单工厂模式,需要的工厂类只有一个;

在工厂类中的公共成员函数来创建所需对象;

#include <bits/stdc++.h>
using namespace std;
// 产品父类 
class shape{
public:virtual void cal() = 0;virtual ~shape(){}
}; class triangle:public shape{
public:void cal() override{cout<<"三角形面积";}
};class square:public shape{
public:void cal() override{cout<<"正方形面积";}
};class cycle:public shape{
public:void cal() override{cout<<"圆形面积";}
};// 工厂类
enum class Type:char{triangle , square , cycle
};
class fac{
public:shape* creat_kinds(Type type){shape* ptr = nullptr;switch(type){case Type::triangle:ptr = new triangle;break;case Type::square:ptr = new square;break;case Type::cycle:ptr = new cycle;break;}return ptr;}
}; 
int main(){fac* cur = new fac;shape* obj = cur->creat_kinds(Type::cycle);obj->cal();return 0;
}

工厂模式

简单工厂模式会违反开放封闭原则 在添加类时需要修改子类、枚举类、工厂类、和判断代码

工厂模式通过创立N个工厂类来解决上述问题(对简单工厂模式解耦合),对已经写好的代码无需修改;

#include <bits/stdc++.h>
using namespace std;
// 产品父类 
class shape{
public:virtual void cal() = 0;virtual ~shape(){}
}; class triangle:public shape{
public:void cal() override{cout<<"三角形面积"<<endl;}
};class square:public shape{
public:void cal() override{cout<<"正方形面积"<<endl;}
};class cycle:public shape{
public:void cal() override{cout<<"圆形面积"<<endl;}
};// 工厂类
class fac{
public:virtual shape* creat_kinds() = 0;virtual ~fac(){}
}; class triangle_fac:public fac{
public:shape* creat_kinds(){return new triangle;}~triangle_fac(){cout<<"三角形被析构"; }
};
class square_fac:public fac{
public:shape* creat_kinds(){return new square;}~square_fac(){cout<<"三角形被析构"; }
};class cycle_fac:public fac{
public:shape* creat_kinds(){return new cycle;}~cycle_fac(){cout<<"三角形被析构"; }
};
int main(){fac* cur = new cycle_fac;shape* obj = cur->creat_kinds();obj->cal();delete obj;delete cur;return 0;
}

抽象工厂模式

通过造船,船分为三个模块,船体、武器、动力,三个模块又分为了简易、标准、旗舰三个版本

#include <bits/stdc++.h>
using namespace std;
// 三个抽象类 每个抽象类下三个具体派生类
// 抽象工厂类 一个抽象类 三个派生类
class body{
public:virtual void getbody() = 0;virtual ~body(){}
}; class wood_body:public body{
public:void getbody() override{cout<<"船的船体为<木头>---";}
};class iron_body:public body{
public:void getbody() override{cout<<"船的船体为<钢铁>---";}
};class mental_body:public body{
public:void getbody() override{cout<<"船的船体为<合成金属>---";}
};class weapon{
public:virtual void getweapon() = 0;virtual ~weapon(){} 
};class gun_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<枪>---" ;}
};class cannon_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<炮>---" ;}
};class laser_weapon:public weapon{
public:void getweapon() override{cout<<"船的武器为<激光>---" ;}
};class power{
public:virtual void getpower() = 0;virtual ~power(){} 
}; class human_power:public power{
public:void getpower() override{cout<<"船的动力为<手动>---"; }
};class engine_power:public power{
public:void getpower() override{cout<<"船的动力为<内燃机>---"; }
};class nuclear_power:public power{
public:void getpower() override{cout<<"船的动力为<核反应堆>---"; }
};class ship{
private:body* m_body;weapon* m_weapon;power* m_power;
public:ship(body* o_body , weapon* o_weapon , power* o_power):m_body(o_body) , m_weapon(o_weapon) , m_power(o_power){m_body->getbody();m_weapon->getweapon();m_power->getpower(); }~ ship(){delete m_body;delete m_weapon;delete m_power;} 
};class fac{
public:virtual ship* get() = 0;~ fac(){}
}; class e_fac:public fac{
public:ship* get() override{ship* cur = new ship(new wood_body , new gun_weapon , new human_power);return cur;}
};class m_fac:public fac{
public:ship* get() override{ship* cur = new ship(new iron_body , new cannon_weapon , new engine_power);return cur;}
};class h_fac:public fac{
public:ship* get() override{ship* cur = new ship(new mental_body , new laser_weapon , new nuclear_power);return cur;}
};int main() {fac* cur = new h_fac;ship* res = cur->get();delete cur;delete res;return 0;
}

描述:首先定义三个抽象类,代表船的三个组成部分(船体、武器、动力);每个抽象类下有三个派生类,分别对应初级船、中级船、高级船所用的对应材料。通过ship类将船的三个部分组成起来,一个工厂抽象类fac,通过工厂抽象类的派生类,结合ship类设置三种规格的船。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 属性值计算过程

目录 例子1&#xff0c;确定声明值2&#xff0c;层叠冲突2.1&#xff0c;比较源重要性2.2&#xff0c;比较优先级2.3&#xff0c;比较源次序 3&#xff0c;使用继承4&#xff0c;使用默认值其他 例子 我们来举例说明<h1> 标签最终的样式&#xff1a; <div><h1…

记录一个诡异的bug

将对接oa跳转到会议转写的项目oa/meetingtranslate项目发布到天宫&#xff0c;结果跳转到successPage后报错 这一看就是successPage接口名没对上啊&#xff0c;查了一下代码&#xff0c;没问题啊。 小心起见&#xff0c;我就把successPage的方法请求方式从Post改为Get和POST都…

Linux(基础篇二)

Linux基础篇 Linux基础篇二5. 系统管理5.1 Linux中的进程和服务5.3 systemctl5.4 运行级别CentOS 6CentOS 7 5.5 关机重启命令 Linux基础篇二 5. 系统管理 5.1 Linux中的进程和服务 计算机中&#xff0c;一个正在执行的程序或命令&#xff0c;被叫做“进程”(process) 启动之…

金融客户敏感信息的“精细化管控”新范式

目 录 01 客户信息保护三箭齐发&#xff0c;金融IT亟需把握四个原则‍ 02 制度制约阻碍信息保护的精细化管控 ‍‍‍‍‍‍‍ 03 敏感信息精细化管控范式的6个关键设计 04 分阶段实施&#xff0c;形成敏感信息管控的长效运营的机制 05 未来&#xff0c;新挑战与新机遇并存 …

【无标题】jenkins消息模板(飞书)

这里写目录标题 Jenkins 安装的插件 发送消息到飞书预览 1 &#xff08;单Job&#xff09;预览 2 &#xff08;多Job&#xff0c;概览&#xff09; Jenkins 安装的插件 插件名称作用Rebuilder Rebuilder。 官方地址&#xff1a;https://plugins.jenkins.io/rebuild 安装方式&a…

vue组装模板(侧边栏+顶部+主体)--项目阶段4

目录 一、前言介绍 二、结构解析 三、页面拆分 &#xff08;一&#xff09;页面拆分 1.侧边栏页面&#xff08;固定&#xff09;--Aside.vue 2.顶部页面&#xff08;固定&#xff09;--Header.vue 3.主体页面&#xff08;不固定的&#xff09;--示例用UserView…

【位运算进阶之----左移(<<)】

今天我们来谈谈左移这件事。 ❤️简单来说&#xff0c;对一个数左移就是在其的二进制表达末尾添0。左移一位添一个0&#xff0c;结果就是乘以2&#xff1b;左移两位添两个0&#xff0c;结果就乘以2 ^ 2&#xff1b;左移n位添n个0&#xff0c;结果就是乘以2 ^ n&#xff0c;小心…

延时盲注技术:SQL 注入漏洞检测入门指南

部分数据来源:ChatGPT 环境准备 引言 在网络安全领域中,SQL 注入漏洞一直是常见的安全隐患之一。它可以利用应用程序对用户输入的不恰当处理,导致攻击者能够执行恶意的 SQL 查询语句,进而获取、修改或删除数据库中的数据。为了帮助初学者更好地理解和检测 SQL 注入漏洞,…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)2

紧接上文 4、新建Maven项目 clean package -Dmaven.test.skiptrue 用于构建项目并跳过执行测试 拉到最后选择构建后操作 SSH server webExec command scp 192.168.77.18:/root/.jenkins/workspace/probe/psi-probe-web/target/probe.war /usr/local/tomcat/webapps/ /usr/loca…

电商设计之分类模块设计

1、现在店铺流行这些简单的风格 2、 3、夏季新品 4、妖精的口袋----店铺展示 5、小狗电器-----优秀分类案例 6、客服中心 7、有线手持款---这里全都是有线首饰款&#xff0c;方便找到东西 8、裂帛 8.1裂帛分类模块 8.2 我点击了T恤 8.3 买雪纺衫&#xff0c;这里面全都是雪纺 …

mybatis与spring集成与spring aop集成pagehelper插件

Mybatis与Spring的集成 Mybatis是一款轻量级的ORM框架&#xff0c;而Spring是一个全栈式的框架&#xff0c;二者的结合可以让我们更加高效地进行数据持久化操作。 Mybatis与Spring的集成主要有两种方式&#xff1a;使用Spring的Mybatis支持和使用Mybatis的Spring支持。 使用…

python网络爬虫指南二:多线程网络爬虫、动态内容爬取(待续)

文章目录 一、多线程网络爬虫1.1 线程的基础内容、GIL1.2 创建线程的两种方式1.3 threading.Thread类1.4 线程常用方法和锁机制1.5 生产者-消费者模式1.5.1 生产者-消费者模式简介1.5.2 Condition 类协调线程 1.6 线程中的安全队列1.6 多线程爬取王者荣耀壁纸1.6.1 网页分析1.6…

vue页面在table字段后加单位

<el-table-column label"售价" align"center" width"120"><template slot-scope"scope">{{ ${scope.row.price.toFixed(2)} 元 }}</template> </el-table-column><el-table-column label"金重" …

在云服务器上安装Jenkins

说明&#xff1a;Jenkins是一个部署项目的平台&#xff0c;通过Jenkins可以省去从项目开发–>部署项目之间的所有流程&#xff0c;做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前&#xff0c;先要在云服务上安装JDK、Maven、Git&#x…

java八股文面试[多线程]——sleep wait join yield

sleep和wait有什么区别 sleep 方法和 wait 方法都是用来将线程进入阻塞状态的&#xff0c;并且 sleep 和 wait 方法都可以响应 interrupt 中断&#xff0c;也就是线程在休眠的过程中&#xff0c;如果收到中断信号&#xff0c;都可以进行响应并中断&#xff0c;且都可以抛出 In…

林业气象站——林业种植气象观测

林业气象站是一种用于观测林区气象环境的仪器&#xff0c;能够观测林区天气、土壤等自然环境参数&#xff08;温度、湿度、风速、风向、降雨量、气压、放射线、土壤湿度等&#xff09;&#xff0c;为开展环境观测、天气预报、灾害预警、林区虫害防治起到综合指导作用。 林业气…

lab7 thread

文章目录 Uthread: switching between threadstaskhints思路上下文的恢复和保存thread_createthread_schedule Using threads思路 Barrier Uthread: switching between threads 在这个练习中&#xff0c;你将为一个用户级别线程系统设计上下文切换机制&#xff0c;并实现它。 …

js实现数据关联查找更新。数据求和验证

为了实现这个功能我们和后端定义了数据结构 data:{id&#xff1a;‘’&#xff0c;formInfo:,formInfo2:,formInfo3:,formInfo4:, ......deailData:[ // 明细数据 // saleData 查询带出的对应明细序列号数据{ id:, ocopyId:, copyId:, odoId:, ......, saleData:[ { id:, oc…

【鞋服零售ERP】应收单设计思路

引言 应收单是销售链路上最核心的单据&#xff0c;也是财务价值确认的关键单据&#xff0c;起着向上承接出库和订单&#xff0c;向下联接收款等业务&#xff0c;因此&#xff0c;无论是数据流&#xff0c;还是信息流、价值流都离不开应收单的承接。如此重要的单据&#xff0c;那…

Vue组件通信方式详解(全面版)

在Vue应用开发中&#xff0c;组件通信是一个重要的话题。不同的组件可能需要在不同的情况下进行数据传递和交互。Vue提供了多种方式来实现组件通信&#xff0c;每种方式都有其适用的场景。本文将详细介绍Vue中实现组件通信的各种方式&#xff0c;并为每种方式提供通俗易懂的代码…