在上篇博文中我们已经简单的阐述了大部分有关单例(Singleton)模式的知识点,主要包括何谓单例、单例使用场景、单例几种实现方式及其特点以及单例的局限性。接下来我们将着重阐述有关原型(Prototype)的一些常识,主要涉及原型的用意、实现形式,以及与之相关的clone条件与equals方法和深浅拷贝等问题。
所谓原型(Prototype)模式,是指通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多同类型的对象。下图左侧是原型模式的一般性结构示意图,右侧是简单的实现样例。
原型(Prototype)模式主要采用的是java的clone克隆,克隆有克隆的前提(即满足的条件),也有深、浅之别。
首先,我们来看看克隆满足的条件:1、对任何的对象x,都有 x.clone() != x。即克隆对象与原对象不是同一个对象。2、对任何的对象x,都有 x.clone().getClass() == x.getClass(),即克隆对象与原对象的类型是一样。3、如果对象x的equals()方法定义恰当的话,那么 x.clone().equals(x)应当是成立的。 在java语言的API中,凡是提供了clone()方法的类,都满足上面的这些条件。(一般来说,clone前两个条件必须,后一个可选)。
其次,我们来看看深浅克隆(即拷贝)的问题。浅克隆是指仅仅克隆所考虑的对象,而不克隆它所引用的对象,而深克隆是指把要克隆的对象及其所引用的对象都克隆一遍,这种对引用到的对象的克隆称之为间接克隆。(注:深克隆要深入到多少层是一个不易确定的问题)。
最后,我们再共同关注下克隆满足条件之3equals()方法。关于此条件的满足,很多人误认为可以通过继承得到java.lang.Object对象的equals()方法就足够了,这其实是一个误区点。在java的源码中java.lang.Object的equals()方法是这样的:
public boolean equals(Object obj) {
return (this == obj);
}
也就是说,这仅仅是地址空间而非对象内容的比较,当两个变量同时指向一个对象时,equals()方法才会返回true。很显然,这并不是适合所有需要被克隆的对象的。
一般而言,为了做到深克隆,所有对象都需要实现java.Serializable这个串行化接口。在这里,我们简单地提一下利用序列化的方法做深克隆。
记得在《java与模式》一书中讲到:把对象写到流里的过程是串行化过程(java程序师圈里戏称冷冻或腌咸菜),把对象从流中读出来的并行化过程称解冻或回鲜过程。应当指出,写到流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此,“腌成咸菜”的只是对象的一个拷贝,java咸菜还可以回鲜。实现过程的核心代码大致为:
//deeply clone
public Object clone(){
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}
关于原型(Prototype)模式,姑且阐述至此!
分享到:
相关推荐
本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...
创建型模式关注的是对象的创建过程,包括单例模式、原型模式、工厂模式等。单例模式确保一个类只有一个实例,并提供一个全局访问点;原型模式则是通过复制现有的实例来创建新的实例,适用于创建复杂对象或者避免重复...
- "对象创建"模式:如建造者模式、原型模式,它们专注于对象的创建过程,允许更复杂的实例化逻辑。 - "对象性能"模式:例如享元模式,通过共享对象来减少内存消耗,提高性能。 - "接口隔离"模式:提倡接口的职责应当...
单例模式属于创建型设计模式,还有其他如抽象工厂、工厂方法、建造者、原型模式等,它们都关注于对象的创建。结构型模式如组合、门面、代理、适配器、装饰者、桥接、享元模式则关注于如何组织和组合类或对象。行为型...
【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...
创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 中介者模式、 访问者模式、 状态...
单例模式中,有时也会用到原型模式来创建单例的副本。 总的来说,实验六“原型模式”是一个很好的学习和实践设计模式的机会,它能帮助开发者更好地理解和运用Java的克隆机制,以及在实际项目中如何有效地利用原型...
原型模式(Prototype Pattern)是设计模式中的一种结构型模式,它的主要目的是通过克隆已有对象来创建新对象,而不是重新创建。这种模式可以减少代码重复,提高效率,并且在某些场景下,比如对象的创建成本较高或者...
5. **原型**:原型模式是一种创建型设计模式,它通过复制已有对象来创建新对象,避免了复杂的初始化过程或重复的创建开销。 6. **委派**:委派模式是一种行为设计模式,它将请求从一个对象传递给另一个对象,让接收...
2 单例模式 2 门面模式 2 模板方法模式 3 策略模式 3 工厂方法模式 3 组合模式 4 抽象工厂模式 4 代理模式 4 命令模式 5 迭代器模式 5 适配器模式 5 原型模式 6 简单工厂模式 6 解释器模式 6 享元模式 7 桥接模式 7 ...
压缩包中的“创建模式”文件可能包含了对以上各种模式的详细解释、示例代码以及实际应用案例,对于理解并掌握这些创建型设计模式有着重要的参考价值。通过学习和实践,开发者可以更好地设计出可扩展、易维护的系统。
【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...
创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。这些模式各有其特定的应用场景和优势。 首先,单例模式是一种常见的创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。...
本资源主要涵盖了创建模式、结构模式和行为模式三大类,每种模式都是面向对象设计的核心部分。 创建模式主要用于解决对象的创建问题,使得对象的创建过程更加灵活,易于扩展。其中: 1. 工厂模式(Factory Pattern...
、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11): 策略模式、模板方法模式、观察者模式、...
原型模式通过复制已有对象来创建新对象,减少了类的实例化次数,尤其适用于创建大型对象时。 6. **适配器模式(Adapter)**: 适配器模式让两个不兼容的接口能够协同工作,通过包装一个类的接口以匹配另一个接口...
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、...