设计模式(3)工厂模式
简单工厂模式
存在一个工厂生产A,B,C三种产品。我们想要写一个程序描述这个过程。
我们可以写一个工厂类负责创建产品,但是产品是不唯一的,我们需要创建一个抽象产品类,然后对于每一种具体的产品,我们就创建对应的具体产品类,具体产品类继承自抽象产品类。
class Products{//抽象产品类
public:
virtual ~Products(){}
virtual void Show() = 0;
};
class A:public Products{
public:
void Show(){
cout<<"A"<<endl;
}
};
class B:public Products{
public:
void Show(){
cout<<"B"<<endl;
}
};
class C:public Products{
public:
void Show(){
cout<<"C"<<endl;
}
};
enum Types{
A,
B,
C
}
class Factory{//负责创建产品的工厂类
public:
Products *Creat(Types type){
switch (type){
case A:
return new A();
break;
case B:
return new B();
break;
case C:
return new C();
break;
default:
return NULL;
break;
}
}
};
在代码中我们不难发现一件事,当我们需要增加一种新的产品的时候,就需要修改工厂类,这是不够好的,还有一点,我们创建了产品之后需要手动delete掉,这是会有内存泄漏的危险的。
工厂方法模式
和简单工厂模式相比,该模式选择抽象工厂,每一个具体工厂生产对应的具体产品。
class Factory{
public:
virtual product *Creat() = 0;
virtual ~Factory(){}
};
class AFactory:public Factory{
public:
product *Creat(){
return new A();
}
}
class BFactory:public Factory{
public:
product *Creat(){
return new B();
}
}
class CFactory:public CFactory{
public:
product *Creat(){
return new C;
}
}
这和简单工厂模式类似,但是区别在于将工厂也抽象化了。如果需要增加新的产品我们就需要引入更多的类。
抽象工厂模式
相对于工厂方法模式,抽象工厂模式可以创建不同的铲平。所以新增产品的时候也需要增加对应的产品的具体工厂类。
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
总结
不难发现,新增产品的时候,都存在一定的缺陷:
简单工厂模式,需要修改工厂类,这显然违背了开闭原则。
工厂方式模式和抽象工厂模式,都需要增加一个对应的产品的具体工厂类,这就会增大了代码的编写量。