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

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快速入门篇

完整代码已打包&#xff0c;需要的小伙伴可以戳这里 [学习资料] 安装和运行 1.安装 要使用"Python"首先要把它安装到你电脑里。打开 [Python官网]下载安装包。 在Windows上安装 打开安装包&#xff0c;选择"Use admin privileges when installing py.exe&qu…...

掌握Go语言中的映射、常量与指针

映射&#xff08;Maps&#xff09; Go语言中的映射&#xff08;map&#xff09;等同于其他编程语言中的哈希表。映射的最大优势是可以使用任何可比较的数据类型作为键&#xff0c;也就是所谓的“map key”或“键”。尽管Go语言中的映射并没有限制哪些数据类型可以作为键&#…...

@35岁的网安人 答应我拿下这些证书

一、CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional&#xff0c;简称“CISP")&#xff0c;中国信息安全测评中心依据中编办赋予的职能&#xff0c;建立和发展的一整套完整的信息安全保障人才培训体系。CISP证书是国家对信息…...

flutter Image

Flutter中&#xff0c;Image是一个用于显示图片的控件&#xff0c;可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式&#xff0c;例如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内的数据映射可以不通过数据卷&#xff0c;直接映射到本地的目录。下面将以mysql容器示例&#xff0c;完成容器的数据映射。 注意&#xff1a;每一个不同的镜像&#xff0c;将来创建容器后内部有哪些目录可以挂载&#xff0c;可以参考DockerHubDocker Hub Container Ima…...

身份证实名认证接口如何用C#实现

一、什么是身份证实名认证&#xff1f; 身份证实名认证又叫身份证实名核验、身份证二要素、身份实名核验、身份证验证&#xff0c;输入姓名、身份证号&#xff0c;校验此两项是否匹配&#xff0c;同时返回生日、性别、籍贯等信息&#xff0c;同时支持港澳台证件核验。 二、身…...

Java开发者无痛丝滑入门Python

哈喽各位道友&#xff0c;经过两周的更新&#xff0c;凡人编程传的第一个“系列”学习笔记《Python基础》已经全部上线啦&#xff0c;现在免费分享给大家&#xff0c;学习路线在下面&#xff0c;点击链接即可跳转对应笔记。 这套笔记有什么不一样的地方呢&#xff1f;这套笔记…...

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999&#xff0c;重装载值为2000&#xff0c;因为设置内部时钟晶振频率为100MHZ &#xff0c;1s跳 100 000000次 &#xff0c;跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…...

SQLSERVER查看包含某个字段的所有表

查看包含某个字段的所有表&#xff1a; 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中&#xff0c;INSERT INTO ... ON DUPLICATE KEY UPDATE 和 REPLACE INTO 都是用来处理插入或更新数据的语句&#xff0c;但它们在性能和行为上有所不同。 二、REPLACE INTO REPLACE INTO 语句在遇到唯一键或主键冲突时&#xff0c;会先删除旧记录&#xf…...

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…...

你需要尝试的5种讲故事模板

好消息&#xff1a;你不需要成为一位创意写作专家也能讲述一个精彩的故事。 坏消息&#xff1a; 任何人 都可以写一篇博客&#xff0c;或者在社交媒体上发表一些内容&#xff0c;或者拼凑一个故事演示。你需要在大量竞争中抓住目标受众的注意力——更糟的是&#xff0c;内容过…...

只需两步便可生成 51 单片机最精准的延时函数

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

TETFN情感计算的实践复现(论文复现)

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

游戏各个知识小点汇总

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

Python设计模式实战:开启软件设计的精进之旅

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

用RNN(循环神经网络)预测股票价格

RNN&#xff08;循环神经网络&#xff09;是一种特殊类型的神经网络&#xff0c;它能够处理序列数据&#xff0c;并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…...

08-图7 公路村村通(C)

很明显聪明的同学已经发现&#xff0c;这是一个稠密图&#xff0c;所以用邻接矩阵。可以很好的表达&#xff0c;比邻接表有优势&#xff0c;所以&#xff0c;采用邻接矩阵破题&#xff0c; 当然也可以用邻接表&#xff0c;仔细观察我的AC,会发现其实都一样&#xff0c;只是存储…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

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

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

使用 SymPy 进行向量和矩阵的高级操作

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

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

Xcode 16 集成 cocoapods 报错

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