首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型模式

原型模式
EN

Stack Overflow用户
提问于 2012-07-30 10:54:25
回答 3查看 3.8K关注 0票数 4

维基百科的原型模式是:原型模式是一种在软件开发中使用的创造性设计模式,当要创建的对象类型由一个原型实例确定时,原型实例被克隆出来以产生新的对象。此模式用于:

  1. 避免客户机应用程序中对象创建者的子类,就像抽象工厂模式所做的那样。
  2. 避免以标准方式(例如,使用new关键字)创建新对象的内在成本,因为对于给定的应用程序来说,它的成本过高。

我在C++中看到了这种模式的某些演示代码,它们都是使用复制构造函数的。谁能解释第二个点是如何应用的(一般情况下以及在C++的上下文中),因为我们在克隆函数中使用复制构造函数。如果不需要复制构造函数就可以完成,那么一个示例代码片段就很好了。

EN

回答 3

Stack Overflow用户

发布于 2012-07-30 10:58:05

您可以在没有动态分配的情况下进行复制。例如,这里有一个只在本地范围内发生的克隆:

代码语言:javascript
复制
Foo prototype;

void local()
{
    Foo x = prototype; // first copy
    x.mutate();
    Foo y = x;         // another copy
}

永远不会使用动态分配。

的确,return new Foo(*this);也创建了一个副本,但更重要的是该对象是动态分配的。这就是你的文章所暗示的成本。

票数 2
EN

Stack Overflow用户

发布于 2012-12-21 09:19:28

在我用Java制作的游戏中,我遇到了一个非常适合原型模式的有趣情况。你看,我有一个动画对象,它存储了一个要翻转的图像容器,以及一些其他的数据,这些数据跟踪了上一帧呈现的时间,它在哪个帧上,如果动画运行与否,等等。

我发现对于多个角色来说,使用相同的动画对象会导致问题。如果两个角色共享一个动画,他们会在相互冲突的时间打开并关闭动画。我会让男人们站着不动,或者站着动画片。创建动画对象是昂贵和耗时的--通过创建精灵、设置它们显示的时间长度、创建图像的间隔队列等等。

相反,我把动画对象变成了原型对象。如果动画克隆本身,它与所有其他动画共享原始帧集合,因为这些动画是不可变的,但构建起来也很昂贵。相反,新的对象将共享这个不变的基础,但是它们有自己的信息来绘制哪些帧以及何时绘制。

把它想象成投影仪。当它被克隆的时候,新的投影仪可能有它自己的信息,它是否运行,它是什么帧,等等,但它可能使用的是同一片电影,原来的投影仪正在使用。他们不互相绊倒的原因是电影是不可变的。(创建成本也很高)

老实说,以这种方式使用原型是实现轻量级模式的一个很好的方法。对象,这些对象共享创建代价高昂的对象。如果您“克隆”它们,它们将被实例化为它们的新的瞬态状态,但仍然与它的创建者共享那些昂贵的基本对象。

票数 1
EN

Stack Overflow用户

发布于 2012-07-30 11:00:18

调用对象的复制构造函数(它本身不使用动态内存)比通过new在动态内存中执行任何分配要快得多。因为动态内存中的分配是一种系统调用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11720037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档