设计模式:原型模式(“多例”)

指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,调用者不需要知道任何创建细节,不调用构造函数。

原型模式就是如果快速构建对象的方法总结,JDK提供的实现Cloneable接口,实现快速复制 scope=“prototype”,scope=”singleton” 或利用简单工厂将getter、setter封装到某个方法中。单例和原型相对,用同一个对象就单例,不同的对象就clone。

原型模式主要适用于以下场景: 创建对象比较繁琐的场景

1、类初始化消耗资源较多。

2、new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)

3、构造函数比较复杂。

4、循环体中生产大量对象时。

浅克隆

 

 

 

 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包 int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。 浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制

在浅克隆中如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。(引用类型不是新的对象,并没有被复制)

在深克隆中无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。(都是新的对象)

在深克隆,可以通过序列化(Serialization)等方式来实现。序列化就是 将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一 个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现 Serializable接口,否则无法实现序列化操作。

对任何的对象x,都有:x.clone()!=x 。换言之,克隆对象与元对象不是一个对象。

对任何的对象x,都有:x.clone().getClass==x.getClass(),换言之,克隆对象与元对象的类型一样。

原型模式的优点:原型模式性能比直接new一个对象性能高简化了创建过程

原型模式的缺点:必须配备克隆(或者可拷贝)方法 //对克隆复杂对象或对克隆出的对象进行复杂改造时,易带来风险//深拷贝、浅拷贝要运用得当

总结:写法同简单工厂,”工厂类”实现clonable接口(深克隆同时实现Serializable接口),用来copy出新的对象,多例.

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

深克隆

 

 

 

 

深克隆就会破坏单例。实际上防止克隆破坏单例解决思路非常简单,禁止深克隆便可。要么你我们的单例类不实现

Cloneable 接口;要么我们重写 clone()方法,在 clone 方法中返回单例对象即可,具体 代码如下:

@Override
protected Object clone() throws CloneNotSupportedException {
     return INSTANCE;
}
原文地址:https://www.cnblogs.com/LPJ-BLOG/p/12396322.html