当前位置: 首页 > 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

http://www.lryc.cn/news/436110.html

相关文章:

  • 【2024最新版】零基础Python快速入门篇
  • 掌握Go语言中的映射、常量与指针
  • @35岁的网安人 答应我拿下这些证书
  • flutter Image
  • 基于RP2350 MCU的树莓派Pico 2开发板及MicroPython编程使用
  • Docker数据挂载本地目录
  • 身份证实名认证接口如何用C#实现
  • Java开发者无痛丝滑入门Python
  • 【STM32】呼吸灯实现
  • SQLSERVER查看包含某个字段的所有表
  • 【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对比
  • 【CSS in Depth 2 精译_024】4.2 弹性子元素的大小
  • 你需要尝试的5种讲故事模板
  • 只需两步便可生成 51 单片机最精准的延时函数
  • TETFN情感计算的实践复现(论文复现)
  • 游戏各个知识小点汇总
  • Python设计模式实战:开启软件设计的精进之旅
  • 用RNN(循环神经网络)预测股票价格
  • 08-图7 公路村村通(C)
  • Java-sleep()、wait()、join()、yield()的区别
  • Linux命令的补全和自动完成完全开启
  • Deep Active Contours for Real-time 6-DoF Object Tracking
  • IDEA安装教程配置java环境(超详细)
  • Excel文档的读取(1)
  • Linux:体系结构和操作系统管理
  • c++ install boost lib
  • 文件加密最简单的方法有哪些?十个电脑文件加密方法【超详细】
  • IPv6地址的表示方法
  • Kubernetes 之 kubelet 与 CRI、CNI 的交互过程
  • 【python】OpenCV—Age and Gender Classification