一、定义
工厂方法模式属于类的创建型模式,又被称为多态工厂方法模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
相比于简单工厂模式,工厂方法模式的工厂类不再负责产品的创建,而是将工厂类成为一个抽象工厂角色,仅提供具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品,符合设计模式的开放-封闭原则。
二、角色
1.抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化具体产品对象。
3.抽象(Product)角色
工厂方法模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色
UML类图如下:
三、实现
#include<iostream>
using namespace std;
//抽象水果
class AbstructFruit{
public:
virtual void getName() = 0;
};
//抽象工厂
class AbstractFactory{
public:
virtual AbstructFruit* getFruit() = 0 ;
};
//具体水果
class Apple:public AbstructFruit{
public:
void getName(){
cout<<"I'm apple"<<endl;
}
};
//生产具体水果的具体工厂
class AppleFactory:public AbstractFactory{
public:
AbstructFruit* getFruit(){
return new Apple;
}
};
class Banana:public AbstructFruit{
public:
void getName(){
cout<<"I'm banana"<<endl;
}
};
class BananaFactory:public AbstractFactory{
public:
AbstructFruit* getFruit(){
return new Banana;
}
};
int main(){
AbstractFactory *factory = nullptr;
AbstructFruit *fruit = nullptr;
//生产香蕉
factory = new BananaFactory;
fruit = factory->getFruit();
fruit->getName();
delete fruit;
delete factory;
//生产苹果
factory = new AppleFactory;
fruit = factory->getFruit();
fruit->getName();
delete fruit;
delete factory;
//生产其他水果,则在实现具体水果类和生产具体水果的工厂类即可。不需要改变源代码。
return 0 ;
}
四、简单工厂模式和工厂方法模式的比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法模式类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以有一个别名叫多态性工厂方法模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
五、优缺点
优点:
符合设计模式的开放-封闭原则,添加新功能只需要实现对应接口即可。
缺点:
因为每增加一个功能,就必须实现一个具体工厂和一个具体功能产品,所以当要进行大量添加功能时,代码会很臃肿,不好维护。
五、应用场景
1.消费者不关心它所要创建对象的类(产品类)的时候。
2.消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候。