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

概述

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

UML 类图

  • IShape : 产品抽象基类,提供所有通用接口
  • Rectangle、Circle : 具体的产品实现
  • IFactory : 工厂的抽象基类,是工厂方法的核心,生产的产品无关。
  • IRectangle、ICircle:真正的工厂类,每个工厂对应创建产品。

优缺点

  • 每个产品对应了一个工厂,克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。
  • 没新增加一个产品,就要对应增加一个工厂,加大了代码量。

示例

我们直接在之前简单工厂的基础上进行修改,如下:
product.h

#ifndef PRODUCT_H
#define PRODUCT_H
#include 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 using namespace std;
#include "factory.h"#define DELETE(x) {if(x){delete(x);(x) = NULL;}}int main()
{//RectangleIFactory * pFactory = new RectangleFactory();IShape * pShape = pFactory->createShape();pShape->draw();DELETE(pFactory);DELETE(pShape);//CirclepFactory = new CircleFactory();pShape = pFactory->createShape();pShape->draw();DELETE(pFactory);DELETE(pShape);//TriangepFactory = new TriangeFactory();pShape = pFactory->createShape();pShape->draw();DELETE(pFactory);DELETE(pShape);return 0;
}

输出结果:

draw Rectangle..
draw Circle..
draw Triange..

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

代码在这里


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部