您好,登錄后才能下訂單哦!
本篇內容主要講解“什么是單例模式與原型模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是單例模式與原型模式”吧!
單例模式應該算是最常用的設計模式了叭,著名的雙重校驗也是單例模式的一種實現。所謂單例模式就是用來保證一個對象只能創建一個實例,除此之外,它還提供了對實例的全局訪問方式。
所謂餓漢式,人餓了看到啥都想吃。同樣,不管需不需要這個實例,反正我都先給你創建好。
普通實現
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方法的類。
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()
也能同樣構造出手機實例對象。
到此,相信大家對“什么是單例模式與原型模式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。