概述
上一篇介绍了简单工厂模式,该模式集中了所有产品的创建逻辑,缺点就是违反了高内聚责任分配原则,而工厂方法模式正是为了解决这这样的问题,可以说,工厂方法模式是对简单工厂模式的进一步抽象和推广,而此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用以及方便后期维护拓展的目的。
UML 类图
- IShape : 产品抽象基类,提供所有通用接口
- Rectangle、Circle : 具体的产品实现
- IFactory : 工厂的抽象基类,是工厂方法的核心,生产的产品无关。
- IRectangle、ICircle:真正的工厂类,每个工厂对应创建产品。
优缺点
- 每个产品对应了一个工厂,克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。
- 没新增加一个产品,就要对应增加一个工厂,加大了代码量。
示例
我们直接在之前简单工厂的基础上进行修改,如下:
product.h
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
using namespace std;
class IShape
{
public:
IShape();
virtual ~IShape();
virtual void draw() = 0;
};
class Rectangle : public IShape
{
public:
Rectangle(){}
~Rectangle(){}
void draw();
};
class Circle : public IShape
{
public:
Circle(){}
~Circle(){}
void draw();
};
class Triange : public IShape
{
public:
Triange(){}
~Triange(){}
void draw();
};
#endif // PRODUCT_H
product.cpp
#include "product.h"
IShape::IShape()
{
}
IShape::~IShape()
{
}
void Triange::draw(){
cout << "draw Triange.." << endl;
}
void Circle::draw(){
cout << "draw Circle.." << endl;
}
void Rectangle::draw(){
cout << "draw Rectangle.." << endl;
}
factory.h
#ifndef FACTORY_H
#define FACTORY_H
#include "product.h"
class IFactory
{
public:
IFactory();
virtual ~IFactory();
virtual IShape * createShape() = 0;
};
class RectangleFactory : public IFactory
{
public:
RectangleFactory() {}
~RectangleFactory();
IShape * createShape();
};
class CircleFactory : public IFactory
{
public:
CircleFactory() {}
~CircleFactory();
IShape * createShape();
};
class TriangeFactory : public IFactory
{
public:
TriangeFactory() {}
~TriangeFactory();
IShape * createShape();
};
#endif // FACTORY_H
factory.cpp
#include "factory.h"
IFactory::IFactory()
{
}
IFactory::~IFactory()
{
}
RectangleFactory::~RectangleFactory()
{
}
IShape *RectangleFactory::createShape()
{
return new Rectangle();
}
CircleFactory::~CircleFactory()
{
}
IShape *CircleFactory::createShape()
{
return new Circle();
}
TriangeFactory::~TriangeFactory()
{
}
IShape *TriangeFactory::createShape()
{
return new Triange();
}
main.cpp
#include <iostream>
using namespace std;
#include "factory.h"
#define DELETE(x) {if(x){delete(x);(x) = NULL;}}
int main()
{
//Rectangle
IFactory * pFactory = new RectangleFactory();
IShape * pShape = pFactory->createShape();
pShape->draw();
DELETE(pFactory);
DELETE(pShape);
//Circle
pFactory = new CircleFactory();
pShape = pFactory->createShape();
pShape->draw();
DELETE(pFactory);
DELETE(pShape);
//Triange
pFactory = new TriangeFactory();
pShape = pFactory->createShape();
pShape->draw();
DELETE(pFactory);
DELETE(pShape);
return 0;
}
输出结果:
draw Rectangle..
draw Circle..
draw Triange..
对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
代码在这里