• C++设计模式之工厂模式(1)


    关于设计模式的作用:

    帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

    具体可参考:https://www.cnblogs.com/linkstar/p/7859980.html

    由于Caffe中的solver产生一系列的solver子类以及建立一系列layer类时就用到了工厂模式(参考:https://blog.csdn.net/fangjin_kl/article/details/54019066)。所以这里首先介绍一下第一种设计模式-----工厂模式

    参考博客:https://blog.csdn.net/wuzhekai1985/article/details/6660462

    工厂模式有三种:

    (1)简单工厂模式

    (2)工厂方法模式

    (3)抽象工厂模式

    1、简单工厂模式

    这么描述:现在有一个工厂Factory类,专门生成核core,现在要生产两种产品core_A 和 core_B,代码如下:

    enum CTYPE {COREA, COREB};     
    class SingleCore    
    {    
    public:    
        virtual void Show() = 0;  
    };    
    //单核A    
    class SingleCoreA: public SingleCore    
    {    
    public:    
        void Show() { cout<<"SingleCore A"<<endl; }    
    };    
    //单核B    
    class SingleCoreB: public SingleCore    
    {    
    public:    
        void Show() { cout<<"SingleCore B"<<endl; }    
    };    
    //唯一的工厂,可以生产两种型号的处理器核,在内部判断    
    class Factory    
    {    
    public:     
        SingleCore* CreateSingleCore(enum CTYPE ctype)    
        {    
            if(ctype == COREA) //工厂内部判断    
                return new SingleCoreA(); //生产核A    
            else if(ctype == COREB)    
                return new SingleCoreB(); //生产核B    
            else    
                return NULL;    
        }    
    };    

    当然这么做也有一个缺点:当Factory要生产一个新的产品时,就要修改factory类,然而这样就违背了开放封闭原则,即软件实体(类、函数、模块)不可修改,只能扩展;所以为了通过扩展来实现可以生产新的产品,引入了工厂方法模式;

    2、工厂方法模式

    这么来描述:通过类的继承来实现扩展功能,即从父类factory中派生出factory_A类专门用来生产core_A 产品 , 派生出favtory_B类从来生产core_B产品。这样子如果味蕾要生产新的产品时,只需要派生出新的工厂子类就行了。代码如下:

    class SingleCore    
    {    
    public:    
        virtual void Show() = 0;  
    };    
    //单核A    
    class SingleCoreA: public SingleCore    
    {    
    public:    
        void Show() { cout<<"SingleCore A"<<endl; }    
    };    
    //单核B    
    class SingleCoreB: public SingleCore    
    {    
    public:    
        void Show() { cout<<"SingleCore B"<<endl; }    
    };    
    class Factory    
    {    
    public:    
        virtual SingleCore* CreateSingleCore() = 0;  
    };    
    //生产A核的工厂    
    class FactoryA: public Factory    
    {    
    public:    
        SingleCoreA* CreateSingleCore() { return new SingleCoreA; }    
    };    
    //生产B核的工厂    
    class FactoryB: public Factory    
    {    
    public:    
        SingleCoreB* CreateSingleCore() { return new SingleCoreB; }    
    };    

    当然上面这么做也有一个缺点,就是每生产一种新的类别时就需要建立一个新的工厂,那么就存在这样一种情况,依然core_A类,可能我们要对A生产一系列产品,比如单核的A和多核的A,如果还是用工厂方法模式就太繁琐了,所以引入了抽象工厂模式;

    3、抽象工厂模式

    这么描述:它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,就是说父类factory只指定要生产单核类和多核类,而不需要指定A、B、C类等等。

    代码如下:

    //单核    
    class SingleCore     
    {    
    public:    
        virtual void Show() = 0;  
    };    
    class SingleCoreA: public SingleCore      
    {    
    public:    
        void Show() { cout<<"Single Core A"<<endl; }    
    };    
    class SingleCoreB :public SingleCore    
    {    
    public:    
        void Show() { cout<<"Single Core B"<<endl; }    
    };    
    //多核    
    class MultiCore      
    {    
    public:    
        virtual void Show() = 0;  
    };    
    class MultiCoreA : public MultiCore      
    {    
    public:    
        void Show() { cout<<"Multi Core A"<<endl; }    
        
    };    
    class MultiCoreB : public MultiCore      
    {    
    public:    
        void Show() { cout<<"Multi Core B"<<endl; }    
    };    
    //工厂    
    class CoreFactory      
    {    
    public:    
        virtual SingleCore* CreateSingleCore() = 0;  //只指定要生产单核类和多核类,而不需要指定要生产A还是b类等等
        virtual MultiCore* CreateMultiCore() = 0;  
    };    
    //工厂A,专门用来生产A型号的处理器    
    class FactoryA :public CoreFactory    
    {    
    public:    
        SingleCore* CreateSingleCore() { return new SingleCoreA(); }    
        MultiCore* CreateMultiCore() { return new MultiCoreA(); }    
    };    
    //工厂B,专门用来生产B型号的处理器    
    class FactoryB : public CoreFactory    
    {    
    public:    
        SingleCore* CreateSingleCore() { return new SingleCoreB(); }    
        MultiCore* CreateMultiCore() { return new MultiCoreB(); }    
    };   
  • 相关阅读:
    VS2013使用scanf、gets及字符串函数编译报错error C4996: 'scanf': This function or variable may be unsafe. 原因及解决方案
    关于vs2013与office系列软件一起安装出现bug的情况描述以及解决办法——打开vs2013鼠标不动/动不了
    武汉华师驾校学车笔记_纪实
    vs2013由修改模式改为输入模式。
    解析:求最大公约数的“辗转相除法原理”
    关于scanf与scanf_s的区别,以及用scanf编译出错并且提示找不到可执行文件.exe的解决办法。
    [C编译器]在VS中编译调试C程序
    使用vs编译程序选择新建”空项目“与”win32控制台应用程序“的区别。
    AngularJS+Ionic开发-1.搭建开发环境
    PetaPoco源代码学习--3.Sql类
  • 原文地址:https://www.cnblogs.com/zf-blog/p/9120628.html
Copyright © 2020-2023  润新知