C++设计模式--简单工厂模式
原创
©著作权归作者所有:来自51CTO博客作者luoyayun361的原创作品,请联系作者获取转载授权,否则将追究法律责任
概述
工厂模式:封装对象的实现。它可能是所有设计模式中最有用的模式之一了。这里要说的是简单工厂模式,又称为静态方法工厂模式,属于创建性模式。其原理就是通过传入的参数来判断应该创建什么对象。
UML 类图

- Factory :工厂类的核心,创建各种不同产品对象
- IShape: 产品抽象基类,提供所有通用接口
- Rectangle、Circle : 具体的产品实现
适用场景
- 工厂类负责创建的对象比较少
- 客户端只需要向工厂类传入参数进行创建,不需要关心内部实现
优缺点
优点:结构简单,可以快速创建工厂类结构,客户端只需要知道对应的参数即可, 不用关心工厂内部实现。
缺点:在产品类型较多时,可能造成工厂类逻辑复杂,新增加产品又要修改工厂逻辑,不利于扩展和维护。此外,工厂类集中了所有产品的创建逻辑,违反了高内聚责任分配原则,一旦无法正常工作,将会影响整个系统。
示例
说了这么多,接下来看看一个简单的示例:
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 <iostream>
#include "product.h"
using namespace std;
class Factory
{
public:
enum ShapeType{
RECTANGLE,
CIRCLE,
TRIANGE
};
Factory();
IShape * drawShape(ShapeType type);
};
#endif // FACTORY_H
factory.cpp
#include "factory.h"
Factory::Factory()
{
}
IShape *Factory::drawShape(Factory::ShapeType type)
{
IShape * shape = nullptr;
switch (type) {
case RECTANGLE:
shape = new Rectangle();
break;
case CIRCLE:
shape = new Circle();
break;
case TRIANGE:
shape = new Triange();
break;
default:
shape = nullptr;
break;
}
return shape;
}
main.cpp
#include <iostream>
using namespace std;
#include "factory.h"
#define DELETE(x) {if(x){delete(x);(x) = NULL;}}
int main()
{
Factory * pFactory = new Factory();
IShape * pShape;
pShape = pFactory->drawShape(Factory::RECTANGLE);
pShape->draw();
DELETE(pShape);
pShape = pFactory->drawShape(Factory::CIRCLE);
pShape->draw();
DELETE(pShape);
pShape = pFactory->drawShape(Factory::TRIANGE);
pShape->draw();
DELETE(pShape);
return 0;
}
输出:
draw Rectangle..
draw Circle..
draw Triange..
上述代码在这里