18.C++设计模式-工厂

简单工厂

图片.png

缺点:每增加一种产品就要在工厂中修改

#include <iostream>
using namespace std;

class Fruit {
public:
     virtual void getName() = 0;
};

class Apple : public Fruit {
    void getName() {
        cout<<"我是苹果"<<endl;
    }
};

class Banana : public Fruit {
    void getName() {
        cout<<"我是香蕉"<<endl;
    }
};

class Factory {
public:
    Fruit* create(int num) {
        if (num == 1) {
            return new Apple;
        }
        else if (num == 2) {
            return new Banana;
        }
        else
        {
            cout << "不存在的水果" << endl;
        }
    }
};

void main() {
    Factory* f = new Factory;
    Fruit* fruit = f->create(1);
    fruit->getName();
    delete fruit;

    Fruit* fruit1 = f->create(2);
    fruit1->getName();
    delete fruit1;

    Fruit* fruit2 = f->create(3);
    delete f;
    system("pause");
}

工厂模式

优点:相比于简单工厂模式,将工厂抽象化,更加符合开闭原则,有新的产品加入时,只需要添加新的产品类继承抽象产品,并添加一个本产品工厂继承抽象工厂即可
缺点:在开闭原则下只能生产一种产品,不能生产一个产品组


图片.png
#include <iostream>
using namespace std;

class Fruit {
public:
     virtual void getName() = 0;
};

class Apple : public Fruit {
    void getName() {
        cout<<"我是苹果"<<endl;
    }
};

class Banana : public Fruit {
    void getName() {
        cout<<"我是香蕉"<<endl;
    }
};

class AbstractFactory {
public:
    virtual Fruit* createProduct() = 0;
};

class AppleFactory :public AbstractFactory{
public:
    virtual Fruit* createProduct() {
        return new Apple;
    }
};

class BananaFactory :public AbstractFactory {
public:
    virtual Fruit* createProduct() {
        return new Banana;
    }
};

void main() {
    AbstractFactory* f = NULL;
    Fruit* fruit = NULL;
    
    f = new AppleFactory;
    fruit = f->createProduct();
    fruit->getName();
    delete fruit;
    delete f;

    f = new BananaFactory;
    fruit = f->createProduct();
    fruit->getName();
    delete fruit;
    delete f;

    system("pause");
}

抽象工厂模式

相较于工厂模式,可以生产一个产品组


图片.png
#include <iostream>
using namespace std;

class Fruit {
public:
     virtual void getName() = 0;
};

class NorthApple : public Fruit {
    void getName() {
        cout<<"我是北方苹果"<<endl;
    }
};

class NorthBanana : public Fruit {
    void getName() {
        cout<<"我是北方香蕉"<<endl;
    }
};

class SourthApple : public Fruit {
    void getName() {
        cout << "我是南方苹果" << endl;
    }
};

class SourthBanana : public Fruit {
    void getName() {
        cout << "我是南方香蕉" << endl;
    }
};


class AbstractFactory {
public:
    virtual Fruit* createApple() = 0;
    virtual Fruit* createBanana() = 0;
};

class NorthFactory :public AbstractFactory {
public:
    virtual Fruit* createApple() {
        return new NorthApple;
    }
    virtual Fruit* createBanana() {
        return new NorthBanana;
    }
};

class SourthFactory :public AbstractFactory {
public:
    virtual Fruit* createApple() {
        return new SourthApple;
    }
    virtual Fruit* createBanana() {
        return new SourthBanana;
    }
};

void main() {
    AbstractFactory* f = NULL;
    Fruit* fruit = NULL;
    
    f = new SourthFactory;
    fruit = f->createApple();
    fruit->getName();
    delete fruit;

    fruit = f->createBanana();
    fruit->getName();
    delete fruit;
    delete f;

    f = new NorthFactory;
    fruit = f->createApple();
    fruit->getName();
    delete fruit;

    fruit = f->createBanana();
    fruit->getName();
    delete fruit;

    delete f;
    system("pause");
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是抽象工厂模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 4,801评论 0 6
  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 5,098评论 0 7
  • 背景 在开发系统的时候,我们可能会有把数据备份到HDFS的需求。如果我们自身的系统是用Java开发的,那么直接用H...
    shengofbig阅读 12,274评论 1 1
  • 前几天认识一个女孩,长得很清秀,很文静,自己一个人拉着两个很大的箱子,来北京找工作。 我以为她至少也20多岁了,没...
    尛垚淼阅读 1,163评论 0 0
  • 翠翠依旧守在祖父的坟旁不肯离去,老马兵经常来看她照旧谈点可怜祖父的往事,也唱祖父唱过的歌,有时也讲自己以前当...
    咸鱼坦荡荡阅读 3,056评论 0 0