工厂方法模式是一种创建型模式
优点:
- 工厂方法模式允许在运行时决定要创建的对象的具体类型,而不是在编译时确定。这增加了程序的灵活性。
- 它将对象的创建与使用分离,使得客户端不需要知道要创建的对象的具体类型,只需要知道它们共同的接口。
- 它可以提高代码的可扩展性。如果需要添加新的产品类型,只需要添加一个新的具体工厂类和一个新的具体产品类,而不需要修改现有的代码。
缺点:
- 每增加一个新的产品类型,都需要增加一个新的具体工厂类和一个新的具体产品类,这会增加系统的复杂性。
- 客户端必须知道所有的工厂类,并根据需要选择使用哪一个工厂类来创建对象。这增加了客户端的复杂性。
满足的设计原理:
- 开闭原则(对扩展开放,对修改关闭),因为当需要添加新的产品类时,只需添加相应的工厂子类并重写工厂方法即可,而无需修改客户端代码。这样,客户端代码可以在不修改的情况下扩展新的功能。
- 依赖倒置原则(抽象不应该依赖于细节,细节应该依赖于抽象),因为客户端代码依赖于产品的抽象接口,而不是具体实现类。这样,当具体实现类发生变化时,客户端代码不会受到影响。
- 单一职责原则(一个类应该只有一个引起它变化的原因),因为它将对象的创建逻辑封装在工厂类中,使得工厂类只负责创建对象,而不负责其他职责。这样,当对象的创建逻辑发生变化时,只需修改工厂类即可,而不会影响到其他代码。
常用的实例:
- 工厂方法模式常用于需要在运行时动态创建具有特定接口的对象的情况。例如,一个绘图系统,根据用户的输入绘制不同的图形,如正方形、矩形、圆形等。又如,在旅游网站上,我们可以预订火车票、汽车票和飞机票1。
- 工厂方法模式能够满足开闭原则(对扩展开放,对修改关闭),因为当需要添加新的产品类时,只需添加相应的工厂子类并重写工厂方法即可,而无需修改客户端代码。
类图:
代码:
#include "iostream"
#include "string"
using namespace std;
class Product
{
public:
virtual void Show()=0;
};
class productA :public Product
{
public:
void Show()
{
cout << "productA" << endl;
}
};
class productB :public Product
{
public:
void Show()
{
cout << "productB" << endl;
}
};
class Factory
{
public:
virtual Product* CreateOperation()=0;
};
class FactoryA:public Factory
{
public:
Product* CreateOperation()
{
return new productA;
};
};
class FactoryB :public Factory
{
public:
Product* CreateOperation()
{
return new productB;
};
};
int main()
{
Factory*factoryA=new FactoryA;
Product*pro=factoryA->CreateOperation();
pro->Show();
return 0;
}