zoukankan      html  css  js  c++  java
  • 设计模式--工厂模式Factory(创建型)

    工厂模式属于创建型模式,分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。

    一、简单工厂模式

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

    例如:

    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;  
        }  
    };  
    

    二、工厂方法模式

    简单工厂模式的缺点是增加新的产品类型时,需要修改工厂类,违反了开闭原则。工厂方法模式,是指定义一个工厂类基类,让其子类决定实例化哪一个类。工厂方法模式相对于简单工厂模式也有缺点,就是要定义一个个工厂类,比简单工厂模式需要更多的类定义。

    例如:

    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; }  
    };  
    

    三、抽象工厂模式

    抽象工厂模式感觉是工厂方法模式的升级。工厂方法模式中基类是定义了一个生产产品的接口,抽象工厂模式是创建一系列相关产品的接口。

    例如:

    //单核  
    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;
        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(); }  
    }; 
    

      

     

    参考:http://blog.csdn.net/wuzhekai1985/article/details/6660462

  • 相关阅读:
    47. Permutations II
    56. Merge Intervals
    57. Insert Interval
    常见算法问题
    67. Unique Paths
    版权声明
    121. Best Time to Buy and Sell Stock
    Leetcode backtracking 合集
    转载 int和string 类型的互换
    prim算法,克鲁斯卡尔算法---最小生成树
  • 原文地址:https://www.cnblogs.com/justkong/p/6228206.html
Copyright © 2011-2022 走看看