Factoryパターン(ファクトリパターン)が最も一般的に使用されるデザインパターンの一つであり、生成に関するパターンがあり、彼はオブジェクトを作成するための最良の方法を提供しています。我々は、オブジェクトを作成するときにファクトリモードは、論理を作成するために暴露し、新しく作成されたオブジェクトを指すように統一されたインタフェースを呼び出すことではありません。
使用するときは:私たちは、異なる条件下で異なるオブジェクトを作成する予定。
コード例:
// Shape.h
#pragma once
class Shape
{
public:
Shape();
~Shape();
virtual void draw() = 0;
};
// Shape.cpp
#include "Shape.h"
Shape::Shape()
{
}
Shape::~Shape()
{
}
// Circle.h
#pragma once
#include "Shape.h"
class Circle :public Shape
{
public:
Circle();
~Circle();
virtual void draw();
};
// Circle.cpp
#include "Circle.h"
#include <iostream>
using namespace std;
Circle::Circle()
{
}
Circle::~Circle()
{
}
void Circle::draw()
{
cout << "Circle::draw()\n";
}
// Square.h
#pragma once
#include "Shape.h"
class Square :
public Shape
{
public:
Square();
~Square();
virtual void draw();
};
// Square.cpp
#include "Square.h"
#include <iostream>
using namespace std;
Square::Square()
{
}
Square::~Square()
{
}
void Square::draw()
{
cout << "Square::draw()\n";
}
// Rectangle.h
#pragma once
#include "Shape.h"
class Rectangle :
public Shape
{
public:
Rectangle();
~Rectangle();
virtual void draw();
};
// Rectangle.cpp
#include "Rectangle.h"
#include <iostream>
using namespace std;
Rectangle::Rectangle()
{
}
Rectangle::~Rectangle()
{
}
void Rectangle::draw()
{
cout << "Rectangel::draw()\n";
}
// ShapeFatory.h
#pragma once
enum ShapeType
{
Circle_Type,
Square_Type,
Rectangle_Type
};
class Shape;
class ShapeFatory
{
public:
ShapeFatory();
~ShapeFatory();
Shape *getShape(ShapeType shapeType);
};
// ShapeFatory.cpp
#include "ShapeFatory.h"
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Square.h"
ShapeFatory::ShapeFatory()
{
}
ShapeFatory::~ShapeFatory()
{
}
Shape * ShapeFatory::getShape(ShapeType shapeType)
{
Shape *pShape = nullptr;
switch (shapeType)
{
case Circle_Type:
pShape = new Circle();
break;
case Square_Type:
pShape = new Square();
break;
case Rectangle_Type:
pShape = new Rectangle();
break;
default:
break;
}
return pShape;
}#include "ShapeFatory.h"
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Square.h"
ShapeFatory::ShapeFatory()
{
}
ShapeFatory::~ShapeFatory()
{
}
Shape * ShapeFatory::getShape(ShapeType shapeType)
{
Shape *pShape = nullptr;
switch (shapeType)
{
case Circle_Type:
pShape = new Circle();
break;
case Square_Type:
pShape = new Square();
break;
case Rectangle_Type:
pShape = new Rectangle();
break;
default:
break;
}
return pShape;
}
// main.cpp
#include <iostream>
#include "Circle.h"
#include "Rectangle.h"
#include "Square.h"
#include "ShapeFatory.h"
#include <memory>
using namespace std;
void main()
{
ShapeFatory * pShapeFactory = new ShapeFatory;// 创建工厂类对象
Shape *p1 = pShapeFactory->getShape(Circle_Type);// 调用统一接口创建Circle类
p1->draw();// 实际调用circle类的画图方法
Shape *p2 = pShapeFactory->getShape(Square_Type);
p2->draw();
Shape *p3 = pShapeFactory->getShape(Rectangle_Type);
p3->draw();
delete p1;
delete p2;
delete p3;
delete pShapeFactory;
int a;
cin >> a;
}
プログラムの結果:
サークル::描く()
広場::描く()
Rectangel ::描きます()