1.概念
工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类称为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象话的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
2.类图角色职责
1)抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。
2)具体工厂(Concrete Create)角色
具体工厂类是抽象工厂的一个实现,负责实例化一个产品对象。
3)抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4)具体产品(Concrete)角色
工厂方法模式所创建的具体实例对象。
工厂模式UML类图
3.示例代码,工厂生产水果:
factory.h
#ifndef FACTORY_H
#define FACTORY_H
#include <iostream>
using namespace std;
class Fruit
{
public:
virtual void sayname() = 0;
};
class Banana : public Fruit
{
public:
void sayname()
{
cout << "banana" << endl;
}
};
class Apple : public Fruit
{
public:
void sayname()
{
cout << "Apple" << endl;
}
};
class AbFactory
{
public:
virtual Fruit* CreateProduct() = 0;
};
class BananaFactory : public AbFactory
{
virtual Fruit* CreateProduct()
{
return new Banana;
}
};
class AppleFactory : public AbFactory
{
virtual Fruit* CreateProduct()
{
return new Apple;
}
};
//添加新的水果梨
class Pear : public Fruit
{
public:
virtual void sayname()
{
cout << "Pear" << endl;
}
};
class PearFactory : public AbFactory
{
public:
virtual Fruit* CreateProduct()
{
return new Pear;
}
};
#endif // FACTORY_H
main.cpp
int main()
{
AbFactory *factory;
Fruit *fruit;
factory = new BananaFactory;
fruit = factory->CreateProduct();
fruit->sayname();
factory = new AppleFactory;
fruit = factory->CreateProduct();
fruit->sayname();
//新添加的水果
factory = new PearFactory;
fruit = factory->CreateProduct();
fruit->sayname();
delete fruit;
delete factory;
return 0;
}
工厂模式解决了简单工厂模式添加新的产品,需要修改工厂类的问题。当工厂模式添加新的产品时,只需要添加新的产品类和对应产品的工厂即可。