小小及

工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

使用场景:工厂模式一般用于创建一类对象,而不用每次在使用时通过new()对象才能使用对象,而是通过工厂来完成对象的创建,这样不但提供了统一创建对象的入口,而且对于程序的可维护和可测试性都有很大的提高。

1、工厂负责创建某一类对象的时候,或者说工厂的职责比较单一时,如果说多个类型的对象时候,用工厂模式就不如使用抽象工厂了

2、一般比较少的积累对象,可以通过类型的判定创建不同的对象时,也是可以通过工厂模式来完成,例如多数据库的支持,我们在设计数据访问层时,利用简单对象工厂,通过枚举或者配置文件的形式,来动态的创建数据访问层实例。

3、一般来说类型单一的对象,或者类型比较少的时候,使用工厂模式来创建对象可以解决一类问题。还可以通过一个总的工厂,来创建多个工厂,然后多个工厂负责创建相应的实例,有点类似我们平时说的目录结构似的。

简单工厂模式:

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类,违背了开闭原则:应扩展,不应修改。

于是提出工厂方法模式

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

 

  

 

posted on 2018-08-02 13:29  小小及  阅读(246)  评论(0编辑  收藏  举报

导航