当前位置: 首页 > 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;只是存储…...

Java-sleep()、wait()、join()、yield()的区别

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

Linux命令的补全和自动完成完全开启

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

Deep Active Contours for Real-time 6-DoF Object Tracking

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

IDEA安装教程配置java环境(超详细)

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

Excel文档的读取(1)

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

Linux:体系结构和操作系统管理

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

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…...

文件加密最简单的方法有哪些?十个电脑文件加密方法【超详细】

在当今数字化和信息化的时代&#xff0c;数据已成为企业最重要的资产之一。内部数据外泄不仅可能导致商业秘密的丧失&#xff0c;还可能对企业的声誉和财务健康造成严重影响。为了有效防止内部数据外泄&#xff0c;企业需要实施综合的防泄密解决方案。以下是十大最佳防泄密解决…...

IPv6地址的表示方法

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

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程

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