工厂设计模式
工厂模式属于创建型模式,用于批量实例化对象。
下面均为抽象工厂的实现。
实现一:静态工厂
#include <math.h>
class Figure
{
public:
virtual float area()=0;
};
class Rectangle : public Figure
{
public:
Rectangle(float flength, float fwidth) : _flength(flength), _fwidth(fwidth) {}
virtual float area()
{ return _flength * _fwidth; }
private:
float _flength;
float _fwidth;
};
class Circle : public Figure
{
public:
Circle(float fradius) : _fradius(fradius) {}
virtual float area()
{ return PI * _fradius * _fradius; }
private:
float _fradius;
static float PI;
};
float Circle::PI = 3.14159;
class Triangle : public Figure
{
public:
Triangle(float fa, float fb, float fc) : _fa(fa), _fb(fb), _fc(fc) {}
virtual float area()
{
float p = (_fa + _fb + _fc) / 2; // Heron's formula
return sqrt(p * (p - _fa) * (p - _fb) * (p - _fc));
}
private:
float _fa;
float _fb;
float _fc;
};
class StaticFactory
{
public:
static Rectangle * getRectangle()
{
int length = 5;
int width = 6;
return new Rectangle(length, width);
}
static Circle * getCircle()
{
int radius = 10;
return new Circle(radius);
}
static Triangle * getTriangle()
{
int a = 3;
int b = 4;
int c = 5;
return new Triangle(a, b, c);
}
};
缺点:
- 违反单一职责原则。
- 违反开闭原则(即对扩展开放,对修改关闭)。
适用于创建对象的类型少的情况。
实现二:工厂方法
#include <math.h>
class Figure
{
public:
virtual float area()=0;
};
class Rectangle : public Figure
{
public:
Rectangle(float flength, float fwidth) : _flength(flength), _fwidth(fwidth) {}
virtual float area()
{ return _flength * _fwidth; }
private:
float _flength;
float _fwidth;
};
class Circle : public Figure
{
public:
Circle(float fradius) : _fradius(fradius) {}
virtual float area()
{ return PI * _fradius * _fradius; }
private:
float _fradius;
static float PI;
};
float Circle::PI = 3.14159;
class Triangle : public Figure
{
public:
Triangle(float fa, float fb, float fc) : _fa(fa), _fb(fb), _fc(fc) {}
virtual float area()
{
float p = (_fa + _fb + _fc) / 2;
return sqrt(p * (p - _fa) * (p - _fb) * (p - _fc));
}
private:
float _fa;
float _fb;
float _fc;
};
// Factory
class Factory
{
public:
virtual Figure * create()=0;
};
class RectangleFactory : public Factory
{
public:
Figure * create()
{
int length = 5;
int width = 6;
return new Rectangle(length, width);
}
};
class CircleFactory : public Factory
{
public:
Figure * create()
{
int radius = 10;
return new Circle(radius);
}
};
class TriangleFactory : public Factory
{
public:
Figure * create()
{
int a = 3;
int b = 4;
int c = 5;
return new Triangle(a, b, c);
}
};
优点:
- 满足单一职责原则。
- 满足开闭原则。
适用场景:
- 针对复杂对象。
- 针对一系列的对象。