2012-07-29 65 views
7

我正在通过Java设计模式,并得到了一些怀疑/问题原型设计模式。 首先让我说出我的理解。原型设计模式用于创建对象 在内存或资源方面代价很高。所以在这种情况下,我们使用已经可用的那个对象的克隆。 那么创建新对象和clone()之间有什么区别?对象在内存中存储在哪里?java原型设计模式对象创建

+0

这可能对您有所帮助http://stackoverflow.com/questions/663079/does-cloning-provide-a-performance-improvement-over-constructors-factory-methods – 2012-07-29 05:27:43

回答

3

原型设计模式节省了两种成本 - 节省时间和节省空间。

节省时间在创建对象时需要对辅助信息进行高成本访问 - 例如从文件,数据库或通过网络请求配置数据。例如,如果要从存储在Web服务器上的模板中构建大量页面,则只需读取一次模板并将其克隆以获取每个新页面的起点便宜,而不是分别查询Web服务器每页。内存节省来自于重用不可变对象:如果原始文件包含大量字符串,则创建新实例需要创建全新的不可变字符串,或手动处理字符串实习。通过让克隆共享模板的不可变部分,使用原型模式可以避免这个问题。

4

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

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