当前位置:编程学习 > C/C++ >>

设计模式C++描述----03.工厂(Factory)模式

上一篇:http://www.zzzyk.com/kf/201205/132171.html


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

一. 简单工厂模式


简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。举个例子,有一家电子产品生产厂家,它只有一个工厂,能够生产两种型号的产品,A 和 B。可以想像一下,A是电吹风,B是电风扇。客户需要什么样的吹风类产品,一定要显示地告诉生产工厂。

 \


代码实现:

[cpp] enum CTYPE {PRODUCT_A, PRODUCT_B}; 
 
//抽象产品类  
class Product     

public:     
    virtual void Show() = 0;   
};     
 
//具体产品A      
class ProductA: public Product     

public:     
    void Show() { cout<<"Product A"<<endl; }     
};     
 
//具体产品B      
class ProductB: public Product     
{     
public:     
    void Show() { cout<<"Product B"<<endl; }     
};     
 
//唯一的工厂,可以生产两种型号的产品,在内部判断  
class Factory     

public:      
    Product* CreateProduct(enum CTYPE ctype)     
    {     
        if(ctype == PRODUCT_A) //工厂内部判断      
            return new ProductA(); //生产产品A      
        else if(ctype == PRODUCT_A)     
            return new ProductB(); //生产产品B      
        else 
            return NULL; 
    } 
}; 
 
 
int main() 

    Factory fac; //工厂  
 
    Product *pro = fac.CreateProduct(PRODUCT_A);//生产产品A  
 
    pro->Show(); 
 
    return 0; 

enum CTYPE {PRODUCT_A, PRODUCT_B};

//抽象产品类
class Product   
{
public:   
    virtual void Show() = 0; 
};   

//具体产品A   
class ProductA: public Product   
{
public:   
    void Show() { cout<<"Product A"<<endl; }   
};   

//具体产品B   
class ProductB: public Product   
{   
public:   
    void Show() { cout<<"Product B"<<endl; }   
};   

//唯一的工厂,可以生产两种型号的产品,在内部判断
class Factory   
{
public:    
    Product* CreateProduct(enum CTYPE ctype)   
    {   
        if(ctype == PRODUCT_A) //工厂内部判断   
            return new ProductA(); //生产产品A   
        else if(ctype == PRODUCT_A)   
            return new ProductB(); //生产产品B   
        else
            return NULL;
    }
};


int main()
{
    Factory fac; //工厂

    Product *pro = fac.CreateProduct(PRODUCT_A);//生产产品A

    pro->Show();

    return 0;
}缺点:

由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

打个比方:


这个工厂在刚建厂时,就要事先把以后的要生产的产品考虑好,部门划分好。如果要生产新的产品,就要改变工厂的空间布局,部门也要重新划分,这是很不利的。当然如果工厂以后发展不大,也就是创建的对象比较少时,还是可以用的。


二. 工厂方法模式


所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

还以刚才的例子解释,这家电子厂赚了不少钱,于是决定再开设一个厂,其中一个工厂专门用来生产A型号的产品,也就是只生产电吹风,而另一工厂专门用来生产B型号的产品,也就是只生产电风扇,这样分工明确了。以后客户要再下定单时,可以直接找到相关的工厂了,比如要A型号的产品,就找A工厂要,不再担心下的定单是A,生产出来的是B产品了。

 \


代码实现:

[cpp] class Product   
{   
public:   
    virtual void Show() = 0; 
};   
 
//产品A  
class ProductA: public Product   
{   
public:   
    void Show() 
    { 
        cout<<"Product A"<<endl; 
    } 
}; 
 
//产品B    
class ProductB: public Product   
{   
public:   
    void Show() 
    { 
        cout<<"Product B"<<endl; 
    } 
};   
 
//抽象工厂  
class Factory 
{   
public:   
    virtual Product* CreateProduct() = 0; 
}; 
 
//生产A的工厂    
class FactoryA: public Factory   

public: 
    Product* CreateProduct() 
    { 
        return new ProductA; 
    } 
};   
 
//生产B的工厂    
class FactoryB: public Factory   
{   
public: 
    Product* CreateProduct() 
    { 
        return new ProductB; 
    } 
}; 
 
int main() 

    Fact

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,