java对象创建 与 原型模式
基于个人理解,如有错误,请留言。
java创建新对象的四种方式。
1、通过new关键字创建对象。(需要调用构造函数)
2、通过反射创建对象。(需要调用构造函数)
3、实现cloneable接口,通过原型方式创建对象。(不需要调用构造函数)
4、实现Serializable接口,通过序列化与反序列化创建对象。(不需要调用构造函数)
#Singleton类定义
package com.company;
import java.io.Serializable;
public class Singleton implements Cloneable, Serializable {
private static volatile Singleton _instance;
// private Singleton(){
// System.out.println("创建新的实例。。。。");
// }
public Singleton(){
System.out.println("创建新的实例。。。。");
}
public static Singleton share(){
if ( _instance == null ){
synchronized ( Singleton.class ){
if( _instance == null ){
_instance = new Singleton();
}
}
}
return _instance;
}
public void sayHello(){
System.out.println("hello singleton");
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
#Main实现方法中
package com.company;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) throws Exception {
//1.通过new方式创建对象,会调用构造器。
Singleton singleton = Singleton.share();
System.out.println(singleton.hashCode());
singleton.sayHello();
//2.通过反射方式创建对象,会调用构造器。
Singleton singleton4 = Singleton.class.newInstance();
System.out.println(singleton4.hashCode());
singleton4.sayHello();
//使用clone方式创建对象,并不走构造器。
Singleton singleton1 = (Singleton) singleton.clone();
System.out.println(singleton1.hashCode());
singleton1.sayHello();
//使用序列化方式创建对象,不走构造器。
//序列化对象
ObjectOutputStream objectOutputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
byteArrayOutputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(singleton);
byte[] bytes = byteArrayOutputStream.toByteArray();
objectOutputStream.flush();
objectOutputStream.close();;
//反序列化对象
ByteArrayInputStream byteArrayInputStream = null;
byteArrayInputStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
Singleton singleton2 = (Singleton) objectInputStream.readObject();
System.out.println(singleton2.hashCode());
singleton2.sayHello();
}
}
原型模式
原型模式的概念
原型模式属于对象的创建模式。通过给出一个原型对象来指明所要创建的对象的类型。,然后利用这个原型对象克隆出更多同类型的对象。
思想:
如果创建一个对象的构造函数比较复杂,或者耗时间比较长,或通过创建多个对象来实现,此时最好不要通过new关键字来创建实例并初始化;而是通过对这些对象属性或者方法进行复制来实现创建,这个就是原型模式的最初思想。原型模式原意是创建共享型的对象,java的默认clone方法实现的是浅拷贝模式。即对象中的对象属性时共享的。
java构造函数方式拷贝 与 clone方式拷贝
在复制对象的形式上,有通过构造函数接受同类对象实例 和 clone方式拷贝的方式。