java原型设计模式对象创建

use*_*967 8 java design-patterns prototype-pattern

我正在经历Prototype设计模式并提出了一些问题.

我已经理解Prototype设计模式用于创建在内存或资源方面成本高昂的对象.在这种情况下,我们使用已经可用的对象的克隆.

那么创建一个new对象有什么区别clone()呢?对象存储在内存中的哪个位置?

Ern*_*ill 5

Javaclone()方法只是创建一个新对象并将成员变量值复制到其中。一般来说,它既不比创建一个新对象更昂贵,也不比它便宜。唯一clone()可能比创建对象更便宜的时间是对象new的构造函数做了一些昂贵的事情:例如,如果构造函数接受参数并将它们用作数据库查询的一部分怎么办?在这种情况下,使用clone()会更便宜,因为不会发生昂贵的查询操作。

使用这种设计模式还有其他原因:大多数情况下,当对象在使用前需要复杂的设置时,在构造函数中无法方便地完成。想象一下,一个对象有 20 个需要设置的属性。如果您使用构造函数参数设置它们,那么该构造函数将非常丑陋——想象一个具有 20 个参数的构造函数!相反,您可以构造一个可能没有参数的对象,使用 mutator 方法设置 20 个值,然后clone()在需要时制作现成副本的对象。clone()根本不需要参数,所以它显然不那么难看。如果你需要这个对象的几个不同版本的多个副本,那么原型模式就变得有吸引力了。


das*_*ght 4

原型设计模式提供两种成本节省——时间节省和空间节省。

当创建对象需要昂贵地访问辅助信息(例如,从文件、数据库或通过网络请求配置数据)时,可以节省时间。例如,如果您要根据存储在 Web 服务器上的模板构建大量页面,则读取模板一次并克隆它以获取每个新页面的起点会更便宜,而不是单独查询 Web 服务器以获取每个新页面的起始点。每一页。

内存节省来自于重用不可变对象:如果原始对象包含大量字符串,则创建新实例将需要创建全新的不可变字符串,或者手动处理字符串驻留。使用原型模式可以通过让克隆共享模板的不可变部分来优雅地避免此问题。