设计模式之工厂模式

来源:互联网 发布:网络作家收入100排行榜 编辑:程序博客网 时间:2024/06/06 01:11

设计模式之工厂模式

编程本质上是现实世界的抽象实现,所以编程也有一定的套路在,为了方便我们的工作学习,我们需要不断积累这种套路,所幸已经有许多巨人总结了许多“套路”,那么再该系列,我将介绍这些“程序设计模式”,并用C++加以实现,介绍过程中也会加入我的个人想法,欢迎大家批评指正。

  • 简单工厂模式
  • 工厂模式
  • 抽象工厂模式

目录

  • 设计模式之工厂模式
      • 目录
    • 快捷键
    • 简单工厂模式
      • 代码实现
    • 工厂模式
    • 抽象工厂模式


快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

1 简单工厂模式

简单工厂模式是指由工厂对象决定实例化哪一个产品类。

优点:只需要告诉工厂型号,不需要记住产品具体名称;
缺点:新增产品时,需要修改工厂类。(违反开放-封闭原则)

代码实现

步骤如下:
1)首先,定义一个抽象类shape,其中定义了纯虚函数start()
2)然后,通过继承定义了“实体”类(具体产品)circleshape
3)接着,定义一个工厂类,实现了shape* factory::creat(int type),该函数根据输入确定要实例化哪一个子类(产品即circleshape),将其返回给基类对象;
4)最后,在代码中只要实例化一个工厂类,根据需要动态选择具体产品。

#include <iostream>using namespace std;class shape{    public:    virtual void start() = 0;};class circle : public shape{    public:    void start(){    cout << "circle" << endl;    }};class rectange : public shape{    public:    void start(){    cout << "rectange" << endl;    }};class factory{    public:    shape* creat(int type)    {        shape* temp = NULL;        switch(type){            case 1:                temp = new circle();                break;            case 2:                temp = new rectange();                break;            default:                temp = new circle();                break;        }        return temp;    }};int main(){    factory* fac = new factory();    shape* shape1 = fac->creat(2);    shape1->start();    return 0;}

2 工厂模式

工厂模式是对简单工厂模式的优化,即在增加产品时不需要修改工厂类。

优点:增加产品时不需要修改工厂类。
缺点:一个工厂只能生产一种产品,因此可以考虑再加一层抽象(即一个工厂只生成一类产品,具体什么产品可以由子类决定)。

#include <iostream>using namespace std;class shape{    public:    virtual void start() = 0;};class circle : public shape{    public:    void start(){    cout << "circle" << endl;    }};class rectange : public shape{    public:    void start(){    cout << "rectange" << endl;    }};class factory{    public:    virtual shape* creat() = 0;};class factory_A : public factory{public:    shape* creat(){        return new circle();    }};class factory_B : public factory{public:    shape* creat(){        return new rectange();    }};int main(){    factory* fac1 = new factory_A();    factory* fac2 = new factory_B();    fac1->creat()->start();    fac2->creat()->start();      return 0;}

抽象工厂模式

抽象工厂模式即把产品抽象成系列产品,具体产品从这些抽象产品继承获得,工厂也提供调用系列产品的接口。

优点:新加产品时,不需要修改产品类。

#include <iostream>using namespace std;// 定义两个系列产品,可以衍生其他具体产品型号class shape1{    public:    virtual void start() = 0;};class shape2{    public:    virtual void start() = 0;};class circle1 : public shape1{    public:    void start(){    cout << "circle1" << endl;    }};class rectange1 : public shape1{    public:    void start(){    cout << "rectange1" << endl;    }};class circle2 : public shape2{    public:    void start(){    cout << "circle2" << endl;    }};class rectange2 : public shape2{    public:    void start(){    cout << "rectange2" << endl;    }};class factory{    public:    virtual shape1* creat1() = 0;    virtual shape2* creat2() = 0;};class factory_A : public factory{public:    shape1* creat1(){        return new circle1();    }    shape2* creat2(){        return new circle2();    }};class factory_B : public factory{public:    shape1* creat1(){        return new rectange1();    }    shape2* creat2(){        return new rectange2();    }};int main(){    factory* fac1 = new factory_A();    factory* fac2 = new factory_B();    fac1->creat1()->start();    fac1->creat2()->start();    fac2->creat1()->start();    fac2->creat2()->start();      return 0;}

当要增加一个rectangle3时,只需要从shape1派生出rectangle3,然后扩展一个工厂类rectangle3,即可实现。代码如下:

#include <iostream>using namespace std;// 定义两个系列产品,可以衍生其他具体产品型号class shape1{    public:    virtual void start() = 0;};class shape2{    public:    virtual void start() = 0;};class circle1 : public shape1{    public:    void start(){    cout << "circle1" << endl;    }};class rectange1 : public shape1{    public:    void start(){    cout << "rectange1" << endl;    }};class rectange3 : public shape1{    public:    void start(){    cout << "rectange3" << endl;    }};class circle2 : public shape2{    public:    void start(){    cout << "circle2" << endl;    }};class rectange2 : public shape2{    public:    void start(){    cout << "rectange2" << endl;    }};class factory{    public:    virtual shape1* creat1() = 0;    virtual shape2* creat2() = 0;};class factory_A : public factory{public:    shape1* creat1(){        return new circle1();    }    shape2* creat2(){        return new circle2();    }};class factory_B : public factory{public:    shape1* creat1(){        return new rectange1();    }    shape2* creat2(){        return new rectange2();    }};class factory_C : public factory{public:    shape1* creat1(){        return new rectange3();    }    shape2* creat2(){        return new rectange2();    }};int main(){    factory* fac1 = new factory_A();    factory* fac2 = new factory_B();    factory* fac3 = new factory_C();    fac3->creat1()->start();    fac1->creat1()->start();    fac1->creat2()->start();    fac2->creat1()->start();    fac2->creat2()->start();      return 0;}