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方式拷貝的方式。