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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值