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 0
Figure* 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