创建型模式----工厂方法模式
工厂方法模式的核心是封装类中变化的部分,提取其中善变的部分为独立类,通过依赖注入以达到解耦、复用和方便拓展的目的
工厂方法模式可以解决简单工厂模式的后期拓展问题,不违反“开闭原则”
实现方式
工厂方法模式对简单工厂模式进行了抽象,将工厂(Factory)类抽象化,这个类不再负责产品的创建,而是只指定一些规范,具体的生产工作由其子类完成,这样工厂类和产品类就可以依次对应
角色结构
工厂方法模式的角色分别包括:
- 抽象工厂:是工厂方法的核心,与应用程序无关,任何在模式中创建的对象的工厂类必须实现这个接口
- 具体工厂:是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象
- 抽象产品:工厂方法模式创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口
- 具体产品:它实现了抽象产品所定义的接口
特性
工厂放发模式 = 简单工厂模式+“开闭原则”
优点
- 不需要了解工厂内部实现
- 实现了对象创建和使用的分离
- 系统的拓展性更好
缺点
- 增加了系统中类的个数,系统复杂度增加
- 增加了系统的抽象性和理解难度
工厂方法模式UML类图
工厂方法模式实例
#include <iostream>
using namespace std;
//抽象形状
class Shape {
public:
virtual void showName() = 0;
};
//矩形
class Rect : public Shape {
public:
virtual void showName()
{
cout << "我是矩形!" << endl;
}
};
//圆形
class Circle : public Shape {
public:
virtual void showName()
{
cout << "我是圆形!" << endl;
}
};
//抽象工厂
class AbstractFactory
{
public:
virtual Shape* CreatFactory() = 0;
};
//矩形工厂
class RectFactory : public AbstractFactory {
public:
virtual Rect* CreatFactory() {
return new Rect;
}
};
//圆形工厂
class CircleFactory : public AbstractFactory {
public:
virtual Circle* CreatFactory() {
return new Circle;
}
};
int main()
{
AbstractFactory* factory = NULL;
Shape *shape = NULL;
factory = new RectFactory;
shape = factory->CreatFactory();
shape->showName();
delete factory;
delete shape;
factory = new CircleFactory;
shape = factory->CreatFactory();
shape->showName();
delete factory;
delete shape;
system("pause");
return 0;
}