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,会发现其实都一样,只是存储…...

Java-sleep()、wait()、join()、yield()的区别
关于线程,作为八股文面试中必问点,我们需要充分了解sleep()、wait()、join()以及yield()的区别。在正式开始之前先让我们了解两个概念:锁池和等待池 1.锁池 所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中…...

Linux命令的补全和自动完成完全开启
前言 在安装好RockyLinux8.8后,输入dn后,按下“TAB”能自动提示,但在输入dnf make后,按下“TAB”不能实现自动补全,如果要使Linux的Bash支持完整的自动提示和补全功能,还需要执行一些其它操作。 内容 1、…...

Deep Active Contours for Real-time 6-DoF Object Tracking
这篇论文解决了从RGB视频进行实时6自由度(6-DoF)物体跟踪的问题。此前的基于优化的方法通过对齐投影模型与图像来优化物体姿态,这种方法依赖于手工设计的特征,因此容易陷入次优解。最近的基于学习的方法使用神经网络来预测姿态&am…...

IDEA安装教程配置java环境(超详细)
引言 IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),广泛用于 Java 开发,但也支持多种编程语言,如 Kotlin、Groovy 和 Scala。本文将为你提供一步一步的指南,帮助你在 Windows 系统上顺利安装 Intelli…...

Excel文档的读取(1)
熟悉使用Excel的同学应该都知道,在单个Excel表格里想要分商品计算总销售额,使用数据透视表也可以非常快速方便的获得结果。但当有非常大量的Excel文件需要处理时,每一个Excel文件单独去做数据透视也会消耗大量的时间。就算使用Power Query这样…...

Linux:体系结构和操作系统管理
目录 一、冯诺依曼体系结构 1.问题1 2.问题2 二、操作系统管理 一、冯诺依曼体系结构 本章将会谈论一下对冯诺依曼计算机体系结构的理解。 在2024年,几乎所有的计算机,都遵守冯诺依曼体系结构。 冯诺依曼体系结构是应用在硬件层面的,而硬…...

c++ install boost lib
同步系统上的软件包列表 sudo apt-update 整个库安装: sudo apt-get install libboost-all-dev 安装部分库: sudo apt-get install libboost-thread-dev sudo apt-get install libboost-filesystem-dev 链接时加上: -lboost_filesystem -lboost_system 例如: g -Wall -o bo…...

文件加密最简单的方法有哪些?十个电脑文件加密方法【超详细】
在当今数字化和信息化的时代,数据已成为企业最重要的资产之一。内部数据外泄不仅可能导致商业秘密的丧失,还可能对企业的声誉和财务健康造成严重影响。为了有效防止内部数据外泄,企业需要实施综合的防泄密解决方案。以下是十大最佳防泄密解决…...

IPv6地址的表示方法
IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制数的形式,每组十六进制数间用冒号分隔。 例如:2409:8745:039a:c700:0000:0000:0162,这是IPv6地址的首选格式。 为了书写方便,IPv6还提供了压缩格式…...

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程
序言 当一个新的 Pod 被提交创建之后,Kubelet、CRI、CNI 这三个组件之间进行了哪些交互? Kubelet -> CRI -> CNI 如上图所示: Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet 创建 sandbo…...