工厂模式的定义
工厂模式主要有如下两个功能:
- 创建对象的接口,分装在了对象的创建之中。
- 具体化类的工作延迟到了子类中。
也就是说,工厂模式可以实现对类对象的生产,而类对象的生产是通过工厂方法来实现的,而不能用户自己创建。而且工厂可以根据用户实际需求,来生产所需要的对象。
根据示意图,工厂Factory中实现了方法CreateProduct()来进行产品的生产,而对于不同的产品需求,多态实现不同的产品生产,而保留了产品的生产权利只在工厂之中,使得产品的安全性更高。
简单工厂模式代码实例
struct Shape //形状基类
{
virtual void draw() const= 0; //创建形状
virtual void erea() const= 0; //面积
virtual void setvalue(float ft) = 0; //设置数值;
static Shape* factory(const string &type);
virtual ~Shape() {}
};
class circle :public Shape
{
friend class Shape; //即shape对象可以调动circle对象的所有方法。
private:
float radius;
static const float pi;
protected:
circle(float r = 0) :radius(r)
{
cout << "圆的构造!" << endl;
}
//构造 保护作用域下,类外无法使用构造函数
//只允许工厂来创建对象,而不能直接创建
public:
~circle() { cout << "圆的销毁!" << endl; } //自动变成虚函数
void setvalue(float ft)
{
radius = ft;
}
void draw() const
{
cout << "draw a circle" << endl;
}
void erea() const
{
cout<<"面积="<<radius*radius*pi<<endl;
}
};
const float pi = 3.14;
class square :public Shape
{
friend class Shape; //即shape对象可以调动square对象的所有方法。
private:
float side;
protected:
square(float a = 0) :side(a) { cout << "正方形的构造" << endl; }
public:
~square() { cout << "正方形的销毁" << endl; }; //自动变成虚函数
void setvalue(float ft) { side = ft; }
void draw() const
{
cout << "画出正方形!" << endl;
}
void erea() const
{
cout << "面积是:" << side * side << endl;
}
};
Shape* Shape::factory(const string& type) //static方法类外初始化
{
if (type == "circle")
{
return new circle();
}
else if (type == "square")
{
return new square();
}
else
{
return NULL;
}
}
class Shapefactory //形状工厂
{
public:
Shapefactory() {}
~Shapefactory() {}
Shape* GetShape(const string& type)
{
return Shape::factory(type);
}
};
int main()
{
Shapefactory* shape = new Shapefactory();
Shape *s = shape->GetShape("circle");
s->draw();
s->setvalue(5);
s->erea(); //计算面积
delete s;
Shape* p = shape->GetShape("square");
p->draw();
p->setvalue(5);
p->erea();
delete p;
}
在此实例中,基类Shape就是不同形状的共同属性,也就是工厂可以生产的对象,而通过子类来生产属性确定的产品,例如Circle或者Square。然后通过ShapeFactory工厂里边的GetShape接口来生产产品。
Factory模式对于对象的创建提供了一种很好的实现策略,也保障了对象创建的安全和高效,但是,通常工厂方法只运用于有一个共同的基类,类似于例子中的Shape类。
但是,对于有共同属性的对象的批量创建却有非常高效的属性。