91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是單例模式與原型模式

發布時間:2021-10-11 11:28:21 來源:億速云 閱讀:176 作者:iii 欄目:編程語言

本篇內容主要講解“什么是單例模式與原型模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是單例模式與原型模式”吧!

單例模式

單例模式應該算是最常用的設計模式了叭,著名的雙重校驗也是單例模式的一種實現。所謂單例模式就是用來保證一個對象只能創建一個實例,除此之外,它還提供了對實例的全局訪問方式。

單例模式UML類圖

什么是單例模式與原型模式

單例模式餓漢式

所謂餓漢式,人餓了看到啥都想吃。同樣,不管需不需要這個實例,反正我都先給你創建好。

普通實現

public class SingletonHungry {
    
    //在類加載的時候就已經創建了唯一的實例
    private static final SingletonHungry instance = new SingletonHungry();
    
    //保證外部不能調用構造函數
    private SingletonHungry() {
    }

    //外部調用這個方法,就返回實例
    public static SingletonHungry getInstance() {
        return instance;
    }
    
    //類中其它方法,盡量是static
    public static void func(){}
    
}

靜態代碼塊

public class SingletonHungryStatic {
    //其實就是把new的部分移到了靜態代碼塊中
    private static SingletonHungryStatic instance = null;
    static {
        instance = new SingletonHungryStatic();
    }

    private SingletonHungryStatic() {
    }

    public static SingletonHungryStatic getInstance() {
        return instance;
    }

    //類中其它方法,盡量是static
    public static void func(){}
}

單例模式懶漢式

所謂懶漢,就是要不是有人催促,就不肯去勞動。同理,只有你找我要這個是,才創建出來。

什么是單例模式與原型模式

普通實現

public class SingletonLazy {
    //volatile之前已經講過,防止指令的重排序,這個volatile是不能省略的
    private static volatile SingletonLazy instance = null;
    private SingletonLazy(){}

    public static SingletonLazy getInstance() throws Exception {

        if(instance == null) {
            synchronized (SingletonLazy.class) {
                if(instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
}

靜態內部類

public class SingletonLazyStatic {
    
    /**
     * 靜態內部類注意事項
     *  1. 類加載的時,靜態內部類不會隨著加載
     *  2. 靜態內部類只會初始化一次
     *  3. 線程安全的
     */
    
    private static class StaticClassInstance{
        private static final SingletonLazyStatic INSTACE = new SingletonLazyStatic();
    }
    private SingletonLazyStatic() {
    }
    
    public static SingletonLazyStatic getInstance() {
        return StaticClassInstance.INSTACE;
    }
}

其實還有一種更為優雅的實現方式,那就是使用枚舉,不過之前看那些文章好像都說什么少用,所以本文就不粘出來給各位增加學習成本了。

Client

public class Client {
    public static void main(String[] args) throws Exception {
//        hungry();
//        hungryStatic();
//        lazy();
        lazyStatic();
    }

    public static void lazyStatic() {
        SingletonLazyStatic instance = SingletonLazyStatic.getInstance();
        SingletonLazyStatic instance1 = SingletonLazyStatic.getInstance();
        System.out.println(instance);
        System.out.println(instance1);
    }
	
    //下面3中和上面實現是類似的,只需要更換類名
    public static void lazy() throws Exception {}

    public static void hungry() {}

    public static void hungryStatic() {}

}

原型模式

原型模式聽起來高大上,其實就是一種克隆對象的方法。

說到克隆不得不簡單說下淺拷貝和深拷貝,淺拷貝就是指兩個指針指向了同一個對象,原對象和拷貝對象只要有一個修改,另外一個也隨著修改。深拷貝是指,重新創建了一個和原對象一模一樣內容的拷貝對象,兩者是獨立的。基本數據類型是不參與拷貝過程的

Prototype: 抽象原型類,聲明了clone方法的接口或者基類,其中clone方法必須由派生對象實現。

Concrete Prototype: 具體實現類,主要是用于實現或擴展clone方法的類。

原型模式UML類圖

什么是單例模式與原型模式

原型模式

Prototype

public abstract class PrototypePhone implements Cloneable {
    private String cpu;
    private int price;

    @Override
    public  Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    
    //省略構造函數,get,set方法

}

Concrete Prototype

public class ConcretePrototypeOnePlus extends PrototypePhone {
    public ConcretePrototypeOnePlus(String cpu, int price) {
        super(cpu, price);
        System.out.println("調用了構造函數");
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Client

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        PrototypePhone phone = new ConcretePrototypeOnePlus("865", 3999);
        System.out.println("原型:" + phone);
        for (int i = 0; i < 100; i++) {
            System.out.println("生產第" + (i + 1) + "臺手機:" + phone.clone());
        }
    }
}

運行的話就會發現構建的手機只通過了一次構造函數,其它的使用phone.clone() 也能同樣構造出手機實例對象。

到此,相信大家對“什么是單例模式與原型模式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇明县| 中西区| 鄂伦春自治旗| 古浪县| 突泉县| 大宁县| 临海市| 邯郸市| 易门县| 丹凤县| 建德市| 西青区| 眉山市| 樟树市| 江油市| 麻阳| 武平县| 渑池县| 都安| 邵武市| 罗田县| 邵阳县| 四川省| 思南县| 喀什市| 天水市| 包头市| 临城县| 陕西省| 邵东县| 淮滨县| 长海县| 孟连| 韶关市| 乌兰察布市| 汤阴县| 安庆市| 开鲁县| 泸州市| 新河县| 平度市|