java設計模式 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方式拷貝的方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章