0911,类与类之间的关系,设计原则,工厂模式
01_figure.cc //简单工厂
#include <math.h>
#include <iostream>
#include <string>
#include <memory>using std::cout;
using std::endl;
using std::string;
using std::unique_ptr;//-------------------------------------------------//
//-------------------------------------------------//
class Figure
{
public:virtual void display() const = 0;virtual double area() const = 0;//基类的析构函数设置为虚函数virtual ~Figure(){};
};
//-------------------------------------------------//
//-------------------------------------------------//
class Rectangle
: public Figure
{
public:Rectangle(double length = 0, double width = 0): _length(length), _width(width){cout << "Rectangle(double = 0, double = 0)" << endl;}void display() const override{cout << "Rectangle";}double area() const override{return _length * _width;}~Rectangle(){cout << "~Rectangle()" << endl;}
private:double _length;double _width;
};//-------------------------------------------------//
//-------------------------------------------------//
class Circle
: public Figure
{
public:Circle(double radius = 0): _radius(radius){cout << "Circle(double = 0)" << endl;}void display() const override{cout << "Circle";}double area() const override{return 3.14 * _radius *_radius;;}~Circle(){cout << "~Circle()" << endl;}private:double _radius;
};//-------------------------------------------------//
//-------------------------------------------------//
class Triangle
: public Figure
{
public:Triangle(double a = 0, double b = 0, double c = 0): _a(a), _b(b), _c(c){cout << "Triangle(double = 0, double = 0, double = 0)" << endl;}void display() const override{cout << "Triangle";}double area() const override{double tmp = (_a + _b + _c)/2;return sqrt(tmp * (tmp - _a) * (tmp - _b) * (tmp - _c));}~Triangle(){cout << "~Triangle()" << endl;}
private:double _a;double _b;double _c;
};
//-------------------------------------------------//
//-------------------------------------------------//
//简单工厂/静态工厂:根据产品的名字生产对应的产品
//缺点:违反 单一职责 开放闭合 依赖倒置
//
//优点:简单 名字-->产品class Factory{
public:static Figure* create(const string & name){if(name=="triangle"){Triangle *ptri=new Triangle(10,20,20);return ptri;}else if(name=="circle"){Circle *pcir=new Circle(10);return pcir;}else if(name=="rectangle"){Rectangle *prec=new Rectangle(10.0,20.0);return prec;}else{return nullptr;}}
};
#if 0Figure* pcir=creat_c();Figure* ptri=creat_t();Figure* prec=creat_t();//读取配置文件,获取配置文件中的内容//配置文件的类型:txt,conf,xml,yang//基类接收派生类/* Rectangle *creat_r(){ */Figure *creat_r(){Rectangle *prec=new Rectangle(10,20);return prec;}Figure *creat_t(){Triangle *ptri=new Triangle(10,20,20);return ptri;}Figure *creat_c(){Circle *pcir=new Circle(10);return pcir;}
#endif//-------------------------------------------------//
//-------------------------------------------------//
void func(Figure *pfig){pfig->display();cout << "的面积 : " << pfig->area() << endl;
}//-------------------------------------------------//
//-------------------------------------------------//void test(){/* Figure * pc=Factory::create("circle"); *//* Figure * pt=Factory::create("triangle"); *//* Figure * pr=Factory::create("rectangle"); */unique_ptr<Figure> pc(Factory::create("circle"));unique_ptr<Figure> pt(Factory::create("triangle"));unique_ptr<Figure> pr(Factory::create("rectangle"));func(pc.get());func(pt.get());func(pr.get());}int main(int argc, char **argv)
{test();return 0;
}
02_figure.cc //工厂模式
#include <math.h>
#include <iostream>
#include <string>
#include <memory>using std::cout;
using std::endl;
using std::string;
using std::unique_ptr;//-------------------------------------------------//
//-------------------------------------------------//
class Figure
{
public:virtual void display() const = 0;virtual double area() const = 0;virtual ~Figure(){};
};
//-------------------------------------------------//
//-------------------------------------------------//
class Rectangle
: public Figure
{
public:Rectangle(double length = 0, double width = 0): _length(length), _width(width){cout << "Rectangle(double = 0, double = 0)" << endl;}void display() const override{cout << "Rectangle";}double area() const override{return _length * _width;}~Rectangle(){cout << "~Rectangle()" << endl;}
private:double _length;double _width;
};//-------------------------------------------------//
//-------------------------------------------------//
class Circle
: public Figure
{
public:Circle(double radius = 0): _radius(radius){cout << "Circle(double = 0)" << endl;}void display() const override{cout << "Circle";}double area() const override{return 3.14 * _radius *_radius;;}~Circle(){cout << "~Circle()" << endl;}private:double _radius;
};//-------------------------------------------------//
//-------------------------------------------------//
class Triangle
: public Figure
{
public:Triangle(double a = 0, double b = 0, double c = 0): _a(a), _b(b), _c(c){cout << "Triangle(double = 0, double = 0, double = 0)" << endl;}void display() const override{cout << "Triangle";}double area() const override{double tmp = (_a + _b + _c)/2;return sqrt(tmp * (tmp - _a) * (tmp - _b) * (tmp - _c));}~Triangle(){cout << "~Triangle()" << endl;}
private:double _a;double _b;double _c;
};
//-------------------------------------------------//
//-------------------------------------------------//
//工厂模式,为每个产品创建对应的工厂
//优点:满足 单一职责 开放闭合 依赖倒置
//缺点:工厂的数量随着产品的数量急剧上升class Factory{
public:virtual Figure* create()=0;virtual ~Factory(){}
};
class C_Factory
:public Factory
{virtual Figure* create()override{Circle *pcir=new Circle(10);return pcir;}
};
class R_Factory
:public Factory
{virtual Figure* create()override{Rectangle *pcir=new Rectangle(10,10);return pcir;}
};
class T_Factory
:public Factory
{virtual Figure* create()override{Triangle *pcir=new Triangle(3,4,5);return pcir;}
};//-------------------------------------------------//
//-------------------------------------------------//
void func(Figure *pfig){pfig->display();cout << "的面积 : " << pfig->area() << endl;
}//-------------------------------------------------//
//-------------------------------------------------//void test(){unique_ptr<Factory> recFac(new R_Factory());//创建对象unique_ptr<Figure> pr(recFac->create());//调用创建函数unique_ptr<Factory> recCir(new C_Factory());unique_ptr<Figure> pc(recCir->create());unique_ptr<Factory> recTri(new T_Factory());unique_ptr<Figure> pt(recTri->create());func(pc.get());//unique_ptr --> Figure* func(pt.get());func(pr.get());}int main(int argc, char **argv)
{test();return 0;
}
作业
01 扩展阅读(阅读,加深对面向对象的理解)
[OO真经]:https://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html
02 类与类之间的关系有哪几种?各自的特点怎样的?
继承/泛化 关联 组合 聚合 依赖
结构上: 继承(竖向) 其他(横向)
语义上:继承is,依赖use,关联/组合/聚合has
耦合程度:依赖 <关联 < 聚合< 组合<继承
代码层面:
成员函数:依赖
数据成员:聚合/关联(引用/指针) 组合(成员子对象)
成员函数&数据成员:继承
03 面向对象设计有哪些原则?各自的特点是什么?
单一功能,开放关闭,里氏替换,实现倒置,接口分离,迪米特,组合复用
01_ 单一功能 一个类只做好一件事,只有一个引起它变化的原因
02_ 开放闭合 对抽象编程,而不是对具体编程(开放实现,关闭修改
03_ 里氏替换 派生类必须能替换基类(实现抽象,不能覆盖非抽象方法
04_ 接口分离 设置许多小而专的借口,而不是一个大的接口
05_ 依赖倒置 面向接口编程,依赖于抽象
06_ 迪米特 目标是降低耦合,也叫最少知道/最少知识原则
07_ 组合复用 用组合的方式替代继承
开放闭合是目标,里氏替换是基础,依赖倒置是手段
04 运用所学的UML类图的知识,画出“文本查询程序的扩展”作业的类图。【C++ Primer 15.9节作业】(可以贴图)
05 设计模式可以分为几类?分别有哪些?
创建型(5) 提供对象的创建机制
单例,简单工厂,工厂方法,抽象工厂,原型,建造者
结构性(7) 将类和对象组合成更大的结构,保证结构高效性灵活性
适配器,桥接,组合,装饰,外观,享元,代理
行为型(11) 沟通和对象之间的责任分配
职责链,命令,解释器,迭代器,中介者,备忘录,观察者,状态,策略,模板方法,访问者
06 什么是单例模式?它有哪些特点?
1,唯一性
2,全局访问
3,懒加载
4,控制访问(避免外部直接创建,复制
07 什么是工厂模式?它有哪些特点?
优点:满足单一职责,开放关闭,依赖倒置
缺点:类的数量随需求急剧上升
08 实现工厂模式,并画出其类图
02_figure.cc
相关文章:

0911,类与类之间的关系,设计原则,工厂模式
01_figure.cc //简单工厂 #include <math.h> #include <iostream> #include <string> #include <memory>using std::cout; using std::endl; using std::string; using std::unique_ptr;//-------------------------------------------------// /…...

【2024最新版】零基础Python快速入门篇
完整代码已打包,需要的小伙伴可以戳这里 [学习资料] 安装和运行 1.安装 要使用"Python"首先要把它安装到你电脑里。打开 [Python官网]下载安装包。 在Windows上安装 打开安装包,选择"Use admin privileges when installing py.exe&qu…...
掌握Go语言中的映射、常量与指针
映射(Maps) Go语言中的映射(map)等同于其他编程语言中的哈希表。映射的最大优势是可以使用任何可比较的数据类型作为键,也就是所谓的“map key”或“键”。尽管Go语言中的映射并没有限制哪些数据类型可以作为键&#…...

@35岁的网安人 答应我拿下这些证书
一、CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional,简称“CISP"),中国信息安全测评中心依据中编办赋予的职能,建立和发展的一整套完整的信息安全保障人才培训体系。CISP证书是国家对信息…...

flutter Image
Flutter中,Image是一个用于显示图片的控件,可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式,例如PNG、JPEG、GIF等。 const Image({super.key,required this.image,this.frameBuilder,this.loadingBuilder,th…...

基于RP2350 MCU的树莓派Pico 2开发板及MicroPython编程使用
2021年1月21日,树莓派基金会同时发布了第1代RP2040 MCU芯片和基于RP2040 MCU的第1代树莓派Pico开发板(Raspberry Pi Pico/ Raspberry Pi Pico 1)。2024年8月8日,树莓派基金会又发布了第2代RP2350 MCU芯片并推出了基于RP2350 MCU的第2代树莓派Pico开发板(Raspberry Pi Pico 2)…...

Docker数据挂载本地目录
docker内的数据映射可以不通过数据卷,直接映射到本地的目录。下面将以mysql容器示例,完成容器的数据映射。 注意:每一个不同的镜像,将来创建容器后内部有哪些目录可以挂载,可以参考DockerHubDocker Hub Container Ima…...

身份证实名认证接口如何用C#实现
一、什么是身份证实名认证? 身份证实名认证又叫身份证实名核验、身份证二要素、身份实名核验、身份证验证,输入姓名、身份证号,校验此两项是否匹配,同时返回生日、性别、籍贯等信息,同时支持港澳台证件核验。 二、身…...
Java开发者无痛丝滑入门Python
哈喽各位道友,经过两周的更新,凡人编程传的第一个“系列”学习笔记《Python基础》已经全部上线啦,现在免费分享给大家,学习路线在下面,点击链接即可跳转对应笔记。 这套笔记有什么不一样的地方呢?这套笔记…...

【STM32】呼吸灯实现
对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999,重装载值为2000,因为设置内部时钟晶振频率为100MHZ ,1s跳 100 000000次 ,跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…...
SQLSERVER查看包含某个字段的所有表
查看包含某个字段的所有表: select [name] from sysobjects where [id] in (select[id] from syscolumns where [name] nettime) ORDER BY Name select [name] from sysobjects where [id] in (select[id] from syscolumns where [name] loadtime) ORDER BY Nam…...
【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对比
一、概述 在MySQL中,INSERT INTO ... ON DUPLICATE KEY UPDATE 和 REPLACE INTO 都是用来处理插入或更新数据的语句,但它们在性能和行为上有所不同。 二、REPLACE INTO REPLACE INTO 语句在遇到唯一键或主键冲突时,会先删除旧记录…...

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…...
你需要尝试的5种讲故事模板
好消息:你不需要成为一位创意写作专家也能讲述一个精彩的故事。 坏消息: 任何人 都可以写一篇博客,或者在社交媒体上发表一些内容,或者拼凑一个故事演示。你需要在大量竞争中抓住目标受众的注意力——更糟的是,内容过…...

只需两步便可生成 51 单片机最精准的延时函数
前言# 我们在学习 51 单片机的过程中会用到延时,比如一个简单的流水灯就需要延时来控制依次点亮的时间,或者一些模块在单片机发出读数据指令后,需要延时几十微秒才可以读出数据等等,这些都离不开延时,所以我们需要一个…...

TETFN情感计算的实践复现(论文复现)
TETFN情感计算的实践复现(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 TETFN情感计算的实践复现(论文复现)概述研究背景主要贡献模型框架数据介绍及下载复现过程(重要)运行过程及结果 概…...

游戏各个知识小点汇总
抗锯齿原理记录 SSAA:把成像的图片放大N倍,然后每N个点进行平均值计算。一般N为2的倍数。比如原始尺寸是1000x1000,长宽各放大2倍变成2000x2000。 举例: 原始尺寸: 放大2倍后 最后平均值计算成像: MSAA&…...

Python设计模式实战:开启软件设计的精进之旅
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

用RNN(循环神经网络)预测股票价格
RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…...
08-图7 公路村村通(C)
很明显聪明的同学已经发现,这是一个稠密图,所以用邻接矩阵。可以很好的表达,比邻接表有优势,所以,采用邻接矩阵破题, 当然也可以用邻接表,仔细观察我的AC,会发现其实都一样,只是存储…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...

Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...