目錄
前言
設計模式簡介
什麼是設計模式
為什麼使用設計模式
設計模式類型
总结
首頁 Java java教程 Java設計模式是什麼? Java設計模式中單例模式的介紹

Java設計模式是什麼? Java設計模式中單例模式的介紹

Sep 12, 2018 pm 03:51 PM
java設計模式

這篇文章帶給大家的內容是關於Java設計模式是什麼? Java設計模式中單例模式的介紹 ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言

在剛學程式設計沒多久就聽說過設計模式的大名,不過由於當時還是個徹底的菜鳥,並沒有去觸碰。直到在開始工作中對簡單的業務程式碼較為熟悉之後,才正式的接觸設計模式。當時最早接觸的設計模式是工廠模式,不過本文講的是單例模式,這裡就留著下篇文章在講解。至於為什麼先講解單例模式? 那是因為單例模式是設計模式中最簡單的... 。凡事總有個先後順序,所以就先易後難了。好了,廢話不多說了,開始進入正片。

設計模式簡介

說明:這裡說了的簡介就是真的 「簡介」。

什麼是設計模式

設計模式是一套被重複使用的、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。

為什麼使用設計模式

使用設計模式是為了重複使用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。

設計模式類型

設計模式有23種型別。依照主要分類可以分為三大類:

一、創建型模式

這些設計模式提供了一種在創建物件的同時隱藏創建邏輯的方式,而不是使用new運算子直接實例化物件。這使得程式在判斷針對某個給定實例需要創建哪些物件時更加靈活。

  • 單例模式

  • 工廠模式

  • ##建造者模式

  • 原型模式

#二、結構型模式

#這些設計模式著重類別和物件的組合。繼承的概念被用來組合介面和定義組合物件獲得新功能的方式。

  • 適配器模式

  • 橋接模式

  • 11

    ##組合模式
  • 裝飾模式
  • #外觀模式

享元模式

代理模式
  • #三、行為型模式
  • 這些設計模式特別關注對象之間的通信。
  • 責任鏈模式
  • 指令模式

  • 解釋器模式

  • #迭代器模式

  • 中介者模式

  • 備忘錄模式
  • #觀察者模式
  • 狀態模式
  • #空白物件模式
  • 策略模式

範本模式

  1. 訪問者模式

  2. 設計模式的原則

    #設計模式的六大原則
  3. 開閉原則:對擴充開放,對修改關閉。
  4. 里氏代換原則:對開閉原則的補充。任何基底類別可以出現的地方,子類別一定可以出現。 LSP 是繼承重複使用的基石,只有當衍生類別可以替換掉基底類,且軟體單位的功能不受影響時,基底類別才能真正被重複使用,而衍生類別也能夠在基底類別的基礎上增加新的行為。
  5. 依賴倒轉原則:針對介面編程,依賴抽象而不依賴具體。
  6. 介面隔離原則:盡量使用多個隔離的接口,為了降低類別之間的耦合度。

迪米特法則:一個實體應盡量少與其他實體之間發生交互作用,使得系統功能模組相對獨立。

合成重複使用原則:盡量使用合成/聚合的方式,而不是使用繼承。

單例模式什麼是單例模式#保證一個系統中的某個類別只有一個實例而且該實例易於外界存取。例如Windows介面的任務管理器就可以看做是一個單例。

單例模式的使用場景

在程式中比較常用的是

資料庫連線池執行緒池

日誌物件

等等。 單例模式使用

最早我們在學習

單例模式的時候,基本上都會接觸這兩種模式:餓漢式和飽漢式(懶漢式)。 那我們先來看看這兩個模式的實作。

###餓漢式######定義一個私有的建構方法,並將自身的實例物件設定為一個私有屬性,並加上static和final修飾符,然後透過公共的靜態方法呼叫傳回實例。 ###
 class SingletonTest1 {  

    private SingletonTest1() {  
    }  
    private static final SingletonTest1 instance = new SingletonTest1();  

    public static SingletonTest1 getInstance() {  
        return instance;  
    }  
}
登入後複製
######飽漢式######定義一個私有的建構方法,定義一個該類別靜態私有的變量,然後定義一個公共的靜態方法,對該類別的值進行空判斷,不為空直接返回,否則重新建構一個。 ###
class SingletonTest2 {

     private SingletonTest2() {   
     }   

     private static SingletonTest2 instance;   

     public static SingletonTest2 getInstance() {   
         if (instance == null) {
            instance = new SingletonTest2();
        }   
         return instance;   
     }   
 }
登入後複製

简单的介绍了这两种的模式,然后我们再来看看这两种模式的优缺点吧。
饿汉式

  • 优点:写起来很简单,并且不会因为不加synchronized关键字而造成的线程不安全问题。

  • 缺点:当该类被加载的时候,会初始化该实例和静态变量并被创建并分配内存空间,并且会一直占用内存。

饱汉式

  • 优点:写起来很简单,在第一次调用的时候才会初始化,节省了内存。

  • 缺点:线程不安全,多个线程调用可能会出现多个实例。

  • 总结:书写简单,线程不安全,效率还行。

虽然 饱汉式可以通过加上synchronized关键字保证线程安全。但是效率方法来说还不说是最优。

这里在介绍下个人认为在JDK1.5之前最优的两种写法,一种是静态内部类,另一种是双重锁检查

静态内部类
定义一个私有的构造方法,定义一个该类私有静态的内部类,然后在内部类中定义一个该类的静态变量,然后通过公共的final修饰的静态方法调用返回实例。

  class  SingletonTest4 {
      private SingletonTest4(){
        }
       private static class SingletonTest5{
           private static SingletonTest4 instance = new SingletonTest4();
        }
        public static final SingletonTest4 getInstance(){
            return SingletonTest5.instance;
        }
   }
登入後複製

因为该类的内部类是私有的,除了对外公布的公共静态方法getInstance(),是无法访问的。因为它是延迟加载,所以读取读取实例的时候不会进行同步,几乎没有性能的缺陷,而且还是线程安全的,并且不依赖JDK的版本。

双重锁检查
定义一个私有构造方法,通过volatile定义静态私有变量,保证了该变量的可见性,然后定义一个共有的静态方法,第一次对该对象实例化时与否判断,不为空直接返回,提升效率;然后使用synchronized 进行同步代码块,防止对象未初始化时,在多线程访问该对象在第一次创建后,再次重复的被创建;然后第二次对该对象实例化时与否判断,如果未初始化,则初始化,否则直接返回该实例。

  class SingletonTest6 { 
        private SingletonTest6() { 
        }   
        private static volatile SingletonTest6 instance;  
        public static SingletonTest6 getIstance() { 
            if (instance == null) {
                synchronized (SingletonTest6.class) {
                    if (instance == null) {
                        instance = new SingletonTest6();   
                    }   
                }   
            }   
            return instance;   
        }   
    }
登入後複製

这种模式在很长的一段时间内可以说是最优的了,内存占用低,效率高,线程安全,多线程操作原子性。但是有个缺点就是书写麻烦,对新手不太友好。

JDK1.5之后出现了枚举,并且完美支持单例模式,并且线程安全、效率高!但是这些不是最重要的,最重要的是书写超级简单!究竟有多简单,看下面的示例应该就可以了解一下了。。。

枚举单例

 enum SingletonTest7{
        INSTANCE;
     }
登入後複製

对的,你没看错,就这点代码,其它不需要了。。。
枚举需要在JDK1.5之后的版本,它无偿提供序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候。这种方法也被Effective Java作者Josh Bloch 所提倡。

总结

单例模式的几种使用就到这了,那么我们来总结下使用单例模式需要注意什么(不包括枚举)。

  1. 构造方法私有化(private);

  2. 定义一个私有(private)静态(static)实例化对象;

  3. 对外提供一个公共(public)静态(static)的方法得到该实例;

相关推荐:

Java中Spring Boot有什么优势?

java中三目运算符和数组方法以及整数比较大小的代码

以上是Java設計模式是什麼? Java設計模式中單例模式的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles