设计模式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++ ,