zoukankan      html  css  js  c++  java
  • C++工厂模式

    1、简述

    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,是通过使用一个共同的接口来指向新创建的对象。

    2、何时使用

    工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;

    在创建简单对象时,建议直接new完成一个实例对象的创建。

    3、工作流程

    需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类;

    使用简单工厂模式,我们只需要知道具体的产品型号就可以创建一个产品

    4、缺点

    工厂类集中了所有产品类的创建逻辑,如果产品量较大,会使得工厂类变的非常臃肿

    5、实例

    /*
    关键代码:创建过程在工厂类中完成。
    */
    ​
    #include <iostream>using namespace std;
    ​
    //定义产品类型信息
    typedef enum
    {
        Tank_Type_56,
        Tank_Type_96,
        Tank_Type_Num
    }Tank_Type;
    ​
    //抽象产品类
    class Tank
    {
    public:
        virtual const string& type() = 0;
    };
    ​
    //具体的产品类
    class Tank56 : public Tank
    {
    public:
        Tank56():Tank(),m_strType("Tank56")
        {
        }
    ​
        const string& type() override
        {
            cout << m_strType.data() << endl;
            return m_strType;
        }
    private:
        string m_strType;
    };
    ​
    //具体的产品类
    class Tank96 : public Tank
    {
    public:
        Tank96():Tank(),m_strType("Tank96")
        {
        }
        const string& type() override
        {
            cout << m_strType.data() << endl;
            return m_strType;
        }
    ​
    private:
        string m_strType;
    };
    ​
    //工厂类
    class TankFactory
    {
    public:
        //根据产品信息创建具体的产品类实例,返回一个抽象产品类
        Tank* createTank(Tank_Type type)
        {
            switch(type)
            {
            case Tank_Type_56:
                return new Tank56();
            case Tank_Type_96:
                return new Tank96();
            default:
                return nullptr;
            }
        }
    };
    ​
    ​
    int main()
    {
        TankFactory* factory = new TankFactory();
        Tank* tank56 = factory->createTank(Tank_Type_56);
        tank56->type();
        Tank* tank96 = factory->createTank(Tank_Type_96);
        tank96->type();
    ​
        delete tank96;
        tank96 = nullptr;
        delete tank56;
        tank56 = nullptr;
        delete factory;
        factory = nullptr;
    ​
        return 0;
    }
  • 相关阅读:
    用免费Scrum工具Leangoo思维导图 实现影响地图
    mysql-线程模型
    mongodb-锁
    mongodb-mmapv1存储引擎解析(转)
    netty-read
    netty-bind
    netty-eventloop
    java基础-Executor
    ehcache3-源码简析三
    ehcache3-源码简析二
  • 原文地址:https://www.cnblogs.com/wy0526/p/15727198.html
Copyright © 2011-2022 走看看