java架構之路-(設計模式)五種建立型模式之單例模式

  設計模式自身一直不是很瞭解,但其實咱們時刻都在使用這些設計模式的,java有23種設計模式和6大原則。html

設計模式是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。java

其中包含設計模式

建立型模式,共五種:單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。併發

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。高併發

行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。this

咱們今天就來講說咱們的建立型模式spa

單例模式是Java中最簡單的設計模式之一。它提供了一種建立對象的最佳方式。線程

這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。設計

用一種其它的方式來記憶吧,單例模式猶如咱們吃的土豆,只有一個土豆,你叫他土豆也行,叫他馬鈴薯也能夠,還能夠叫Potato,但最終仍是那一個土豆。代理

注意:

一、單例類只能有一個實例。

二、單例類必須本身建立本身的惟一實例。

三、單例類必須給全部其餘對象提供這一實例。

代碼實現:

  餓漢式單例模式:

package Single; public class CarBean { public static CarBean carBean = new CarBean(); private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //關閉構造方法.防止New對象
    private CarBean() { System.out.println("CarBean構造方法只走一次"); } public static CarBean getInstance() { return carBean; } }
package Single; public class MainTest { /** * 餓漢式靜態常量式單例模式 * 優勢:這種寫法在JVM裝載類的時候就實例化了,避免了線程同步的問題 * 缺點:在類裝載的時候就實例化,沒有達到延時加載的效果,形成內存浪費 * @param args */
    public static void main(String[] args) { CarBean car1 = CarBean.getInstance(); CarBean car2 = CarBean.getInstance(); car1.setName("蘭博基尼"); car2.setName("瑪莎拉蒂"); System.out.println(car1.getName()); System.out.println(car2.getName()); } }

  懶漢式單例模式(非同步):

package Single2; public class CarBean { public static CarBean carBean  = null; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //關閉構造方法.防止New對象
    private CarBean() { System.out.println("CarBean構造方法只走一次"); } public static CarBean getInstance() { if(carBean == null) { carBean = new CarBean(); } return carBean; } }
package Single2; public class MainTest { /** * 懶漢式單例模式:非同步 * 優勢:在調用的時候初始化該單例 * 缺點:並不是線程同步,不建議使用 * @param args */
    public static void main(String[] args) { CarBean car1 = CarBean.getInstance(); CarBean car2 = CarBean.getInstance(); car1.setName("蘭博基尼"); car2.setName("瑪莎拉蒂"); System.out.println(car1.getName()); System.out.println(car2.getName()); } }

  懶漢式單例模式(同步): 

package Single3; public class CarBean { public static CarBean carBean = null; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //關閉構造方法.防止New對象
    private CarBean() { System.out.println("CarBean構造方法只走一次"); } /** * 方法1 * 該方式使用synchronized同步鎖將整個方法同步 實現線程同步 但同步整個方法在高併發的狀況下會形成阻塞效率低下 * 不推薦使用 * @return
     */
    public static synchronized CarBean getInstance1() { if (carBean == null) { carBean = new CarBean(); } return carBean; } /** * 方法2使用synchronized同步實例化改單例的代碼塊;但該方法不能徹底實現同步,可能會產生多個實例; * 例如:在第一次建立時多個線程同時進入if(lazySingleton == null) 則會產生多個實例 * 不推薦使用 * @return
     */
    public static CarBean getInstance2() { if (carBean == null) { synchronized (CarBean.class) { carBean = new CarBean(); } } return carBean; } /** * 方法3:雙重檢查法,同步代碼塊中再次檢查一次是否w爲null解決了上述問題 推薦使用 */
    public static CarBean getInstance3() { if (carBean == null) { synchronized (CarBean.class) { if (carBean == null) { carBean = new CarBean(); } } } return carBean; } }

裏面具體的優缺點我都寫在代碼註釋裏了。

後面會把每個模式都寫一次。

最進弄了一個公衆號,小菜技術,歡迎你們的加入

原文出處:https://www.cnblogs.com/cxiaocai/p/11572564.html

相關文章
相關標籤/搜索