0
点赞
收藏
分享

微信扫一扫

C++设计模式--工厂方法模式


概述

上一篇介绍了简单工厂模式,该模式集中了所有产品的创建逻辑,缺点就是违反了高内聚责任分配原则,而工厂方法模式正是为了解决这这样的问题,可以说,工厂方法模式是对简单工厂模式的进一步抽象和推广,而此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用以及方便后期维护拓展的目的。

UML 类图


C++设计模式--工厂方法模式_设计模式

  • 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..

对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。

代码在这里


举报

相关推荐

0 条评论