工厂方法和简单工厂一样都属于对象创建型模式。
什么是工厂方法模式?工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式和简单工厂的区别:工厂方法模式和简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。
工厂方法模式比简单工厂模式的优势:当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好,工厂方法模式退化后可以演变成简单工厂模式。
(“开放--封闭”指的是通过添加代码的方式,不是通过修改代码的方式完成功能的增强)。
工厂方法模式的类图:
工厂方法模式实现了客户端与具体产品、具体工厂的解耦合。
工厂方法模式的示例代码:
#include <iostream>
using namespace std;
/**
* @brief The Fruit class
* 抽象产品(水果)类,提供统一接口
* 供子类继承实现
*/
class Fruit
{
public:
virtual void getFruit()=0;
virtual ~Fruit(){}
};
/**
* @brief The Banana class
* 具体产品类实现抽象产品类提供的
* 接口
*/
class Banana : public Fruit
{
public:
virtual void getFruit() {
cout<<"Iam Banana,enjoy me~\n";
}
};
/**
* @brief The Banana class
* 具体产品类实现抽象产品类提供的
* 接口
*/
class Apple : public Fruit
{
public:
virtual void getFruit() {
cout<<"Iam Apple,enjoy me~\n";
}
};
/**
* @brief The AbFactory class
* 抽象工厂提供接口给具体工厂类实现
*/
class AbFactory {
public:
virtual Fruit* createProduct()=0;
virtual ~AbFactory(){}
};
/**
* @brief The BananaFactory class
* 具体工厂类继承抽象工厂类实现抽象接口,
* 通过抽象接口返回具体产品的指针给抽象产品
*/
class BananaFactory : public AbFactory
{
public:
virtual Fruit* createProduct() {
return new Banana;
}
};
/**
* @brief The AppleFactory class
* 具体工厂类继承抽象工厂类实现抽象接口,
* 通过抽象接口返回具体产品的指针给抽象产品
*/
class AppleFactory : public AbFactory
{
public:
virtual Fruit* createProduct() {
return new Apple;
}
};
int main()
{
//定义抽象产品类和抽象工厂类的指针
Fruit* fruit = NULL;
AbFactory* abfactory = NULL;
//通过香蕉工厂工厂生产香蕉
abfactory = new BananaFactory;
fruit = abfactory->createProduct();
fruit->getFruit();
//通过苹果工厂生产苹果
abfactory = new AppleFactory;
fruit = abfactory->createProduct();
fruit->getFruit();
//如果想要新的产品就添加新产品类和新产品工厂类
//...
delete fruit;
fruit = NULL;
delete abfactory;
abfactory = NULL;
return 0;
}
运行结果: