C++设计模式之简单工厂模式

本文详细介绍了工厂模式的概念和功能,强调了它如何封装对象创建并延迟到子类中,确保了对象创建的安全性和效率。通过一个简单的形状工厂示例,展示了如何使用工厂模式创建Circle和Square对象,以及如何通过ShapeFactory获取所需形状。工厂模式适用于具有共同基类的对象创建,尤其在批量创建相似对象时能提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式的定义

工厂模式主要有如下两个功能:

  1. 创建对象的接口,分装在了对象的创建之中。
  2. 具体化类的工作延迟到了子类中。

也就是说,工厂模式可以实现对类对象的生产,而类对象的生产是通过工厂方法来实现的,而不能用户自己创建。而且工厂可以根据用户实际需求,来生产所需要的对象。
在这里插入图片描述
根据示意图,工厂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类。
但是,对于有共同属性的对象的批量创建却有非常高效的属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值