模式中的角色和职责
抽象工厂(Abstract Factory)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口;
工厂(Concrete Factory)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象;
抽象(Abstract Product)产品:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口;
具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象。
简单工厂模式 + “开闭原则” = 工厂方法模式
案例
#include <iostream>
#include <cstdlib>
using namespace std;
/*创建一个水果抽象类供具体的水果实现和抽象工厂的返回*/
class AbstractFruit {
public:
virtual void showFruitName() = 0;
};
/*若想添加一种新水果,则不再需要去修改其中任何一个类,
而只需要实现一个新水果工厂和一个新水果具体类即可*/
class Apple :public AbstractFruit {
public:
virtual void showFruitName() {
cout << "Apple" << endl;
}
};
class Orange : public AbstractFruit {
public:
virtual void showFruitName() {
cout << "orange" << endl;
}
};
/*创建一个抽象工厂类,供具体的水果工厂实现,并返回抽象水果类*/
class AbstractFruitFactory {
public:
virtual AbstractFruit* CreateFruit() = 0;
};
/*实现抽象工厂,并返回一个抽象水果指针*/
class AppleFactory : public AbstractFruitFactory {
public:
virtual AbstractFruit* CreateFruit() {
return new Apple;
}
};
class OrangeFactory : public AbstractFruitFactory {
public:
virtual AbstractFruit* CreateFruit() {
return new Orange;
}
};
void test() {
/*根据依赖倒转原则,是针对接口的编程。即只需要使用抽象工厂
类的指针和抽象水果类的指针,通过多态的特性,就可以完成具
体类的业务。*/
AbstractFruitFactory *FruitFactory = NULL;
AbstractFruit *fruit = NULL;
/*抽象类指针,完成Apple业务*/
FruitFactory = new AppleFactory;
fruit = FruitFactory->CreateFruit();
fruit->showFruitName();
delete fruit;
delete FruitFactory;
}
int main(int argc, char **argv)
{
test();
return 0;
}
工厂方法模式的优缺点
优点
不需要记住具体类名,甚至不需要记住具体的参数;
实现了对象创建和使用的分离;
系统的可扩展性提高,无需修改接口和原类。
缺点
增加系统中的类的个数,复杂度和理解度增加;
增加了系统的抽象性和理解难度。
适用场景
客户端不知道它所需要的对象的类;
抽象工厂通过其子类来指定创建哪个对象。