美文网首页
变式工厂设计模式

变式工厂设计模式

作者: 阮明晨 | 来源:发表于2019-06-27 16:27 被阅读0次

```

#include <QCoreApplication>

#include <iostream>

using namespace std;

#define REGIST_CLASS_2(className)\

class className##REGIST\

{\

public: \

    className classnum;\

    className##REGIST(){Factory::procudtion_list.insert(std::make_pair(classnum.GetId(), new className()));}\

};\

static className##REGIST className##GloableDeclare

class Analysis

{

public:

    Analysis(){}

    virtual ~Analysis(){}

    virtual bool open() = 0;

    virtual Analysis *Clone() = 0;

    virtual int GetId(){return id;}

protected:

    int id;

};

//工厂

class Factory

{

private:

    Factory(){}

    static Factory *m_factory;

public:

    ~Factory(){}

    Analysis *Create(int num)

    {

        Analysis *analysis;

        auto iter = procudtion_list.find(num);

        if(iter != procudtion_list.end())

        {

            return iter->second->Clone();

        }

        else

        {

            cout << "not find product!" << endl;

        }

    }

    static Factory *GetInstance()

    {

        if(m_factory == nullptr)

        {

            m_factory = new Factory();

        }

        return m_factory;

    }

    static void DestoryInstance()

    {

        if(m_factory != nullptr)

        {

            delete m_factory;

            m_factory = NULL;

        }

    }

    static std::map<int, Analysis*> procudtion_list;

};

Factory* Factory::m_factory = nullptr;

std::map<int, Analysis*> Factory::procudtion_list;

//产品1

class BagAnalysis : public Analysis

{

public:

    BagAnalysis(){

        this->id = 0;

    }

    BagAnalysis(BagAnalysis& other){

        this->id = other.id;

    }

    virtual ~BagAnalysis(){}

    virtual bool open()

    {

        cout << "chanpin 1 ok" << endl;

        return true;

    }

    virtual Analysis *Clone(){

        return new BagAnalysis(*this);

    }

};

REGIST_CLASS_2(BagAnalysis);

//产品2

class My:public Analysis

{

public:

    My(){

        this->id = 1;

    }

    My(My &other){

        this->id = other.id;

    }

    virtual bool open()

    {

        cout << "chanpin 2 ok" << endl;

        return true;

    }

    virtual Analysis *Clone(){

        return new My(*this);

    }

};

REGIST_CLASS_2(My);

int main(int argc, char *argv[])

{

    QCoreApplication a(argc, argv);

    Factory *factory = Factory::GetInstance();

    Analysis *a1 = factory->Create(0);

    a1->open();

    Factory::DestoryInstance();

    return a.exec();

}

```

相关文章

  • 变式工厂设计模式

    ``` #include #include using namespace std; #define REGIST...

  • 设计模式-java (part1)

    单例设计模式 最好理解的一种设计模式,分为懒汉式和饿汉式。 饿汉式: 懒汉式: 工厂方法模式 工厂方法模式分为三种...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(一)之简单工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(二)之工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

网友评论

      本文标题:变式工厂设计模式

      本文链接:https://www.haomeiwen.com/subject/fjtlcctx.html