创建型设计模式-原型模式
  AWwQJA71Um8k 2023年12月23日 32 0

原型设计模式是一种对象创建型模式,它通过复制现有对象创建新的对象,而无需显式地调用构造函数。

简单来说,原型设计模式就是通过克隆已有对象来创建新对象。

创建型设计模式-原型模式_设计模式

举一个通俗易懂的例子,假设我们有一个图形库,其中有一个基类 Shape 表示图形, 它有一个纯虚函数 draw() 用于绘制图形。

现在我们希望能够复制已有的图形对象来创 建新的图形对象,而无需重新构造图形对象

// 图形基类
class Shape {
public:
	virtual ~Shape() {}
	virtual void draw() = 0;
	virtual Shape* clone() = 0;
};

// 圆形类
class Circle : public Shape {
private:
	std::string color;
	int radius;
public:
	Circle(std::string color, int radius) : color(color), radius(radius) {}
	void draw() override {
		std::cout << "Drawing a circle with color " << color << " and radius " << radius
			<< std::endl;
	}
	Shape* clone() override {
		return new Circle(*this);
	}
};

int main() {
	// 创建一个原型对象
	Shape* circlePrototype = new Circle("red", 5);
	// 克隆原型对象来创建新对象
	Shape* circle1 = circlePrototype->clone();
	Shape* circle2 = circlePrototype->clone();

	// 绘制图形
	circle1->draw(); // Output: Drawing a circle with color red and radius 5
	circle2->draw(); // Output: Drawing a circle with color red and radi

	delete circlePrototype;
	delete circle1;
	delete circle2;
}

在上述代码中,我们定义了一个图形基类 Shape,它声明了纯虚函数 draw 和 clone。

然后我们创建了一个具体的图形类 Circle,它继承自 Shape,并实现 了 draw 和 clone 函数

在 main 函数中,我们首先创建了一个原型对象 circlePrototype,然后通过调

用 clone 方法来创建了两个克隆对象 circle1 和 circle2。最后,我们分别调用 了 draw 方法来绘制图形。

通过原型设计模式,我们可以通过复制已有的图形对象来创建新的图形对象,而无需重

新构造图形对象。这样可以提高对象创建的效率,并且可以动态地添加新的图形对象。 原型设计模式的应用场景通常包括以下情况:

  1. 创建对象的过程比较复杂,且需要频繁地创建相似对象。原型设计模式可以通过复制已有对象来创建新对象,避免了复杂的创建过程,提高了创建对象的效率。
  2. 需要动态地添加新的对象,而且这些对象的类型在运行时才能确定。原型设计模式通过克隆已有对象来创建新对象,可以在运行时动态地添加新的对象类型,而无需显式地调用构造函数


典型应用场景的举例

1,图形编辑器:

在图形编辑器中,可能需要频繁地创建相似的图形对象,如矩形、圆 形等。使用原型设计模式,可以先创建一个原型对象,并通过克隆原型对象来创建新的 图形对象,而无需重新构造对象。

2,缓存系统:

在缓存系统中,可能需要频繁地复制已有的缓存对象来创建的缓存对象。使用原型设计模式,可以通过克隆已有的缓存对象来创建新的缓存对象,而无需重 新从数据库或其他地方获取数据。

3,原始对象的状态保存:

有时候需要保存对象的某个特定状态,以便在需要时恢复回来。原型设计模式可以通过克隆对象来保存和恢复对象的状态,而不需要手动记录和恢复每个属性的值。

总结

原型设计模式适用于需要频繁地创建相似对象或动态地添加新对象的场景。

它可以通过复制已有对象来创建新对象,避免了复杂的创建过程,并且可以在运行时动态地添加新的对象类型。

但是缺点就是:每个类都需要实现clone()方法。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月23日 0

暂无评论

推荐阅读
AWwQJA71Um8k