搜尋
首頁Javajava教程淺析Java設計模式程式設計中的單例模式與簡單工廠模式

單例模式
動機
有時候只有一個類別的實例是很重要的。例如,一個系統應該只有一個視窗管理實例。

單例模式是最簡單設計模式:類別負責實例化自己,確保只有一個實例,並且提供一個訪問這個實例的入口。

目的
1. 確保只有一個實例被創建。
2. 提供存取這個實例的入口。

淺析Java設計模式程式設計中的單例模式與簡單工廠模式

使用final確保被建立一次,private的建構子確保不被實例化。 public的getInstance方法確保外部能夠存取。下方是餓漢模式:

public class Singleton {
  private static final Singleton instance = new Singleton();
   
  private Singleton() {}
   
  public static Singleton getInstance() {
    return instance;
  }
}

   


懶漢模式:

public class SingletonDemo {
    private static volatile SingletonDemo instance = null;
   
    private SingletonDemo() {    }
   
    public static SingletonDemo getInstance() {
        if (instance == null) {
            synchronized (SingletonDemo .class){
                if (instance == null) {
                    instance = new SingletonDemo ();
                }
           }
        }
        return instance;
    }
}

   

的適用場景和實例使用一個適用場景和實例。
2. 控制類,一般整個系統都只有一個控制實例。

具體問題和實作

1. 線程安全,健壯的單例模式應該是線程安全的。

2. 懶漢模式使用了雙重鎖定機制。
3. 餓漢模式使用靜態變量,在程式載入時就實例化,保證了只有一個實例。
4. 抽象工廠和工廠方法通常被設計成單例模式,以確保只有一個工廠。
5. 使用序列化和反序列化時,會有多個實例被創建,使用readResolve函數避免這個情況,不過最好是不要使用序列化。

   public class Singleton implements Serializable {
...
  
// This method is called immediately after an object of this class is deserialized.
// This method returns the singleton instance.
protected Object readResolve() {
  return getInstance();
}
}

   

關鍵點

1. 在多執行緒的程式中,要注意資料的同步。
2. 序列化時要使用readResolve方法傳回實例,避免多個物件被建立。
3. 如果被多個類別載入器載入時,會有多個實例被建立。

簡單工廠模式

動機
簡單工廠模式是抽象工廠和工廠方法的基礎和初步實現。

目的

1. 不向客戶透露物件實例化的細節。

2. 透過通用介面建立物件。

實作

淺析Java設計模式程式設計中的單例模式與簡單工廠模式實作非常簡單:

1. Client需要Product時,不使用new來創建,而是提供 Product 描述給Factory,讓 Factory 提供一個新的 Product 。

2. Factory實例化一個Product給Client。
3. Client使用抽象Product,而不關心Product的具體實作。

實例

1. 繪製形狀的繪圖程式。形狀就是Product接口,三角形這些是Concrete Product,我們可以創建一個工廠,然後根據客戶的描述創建對於的產品。不過當新增新的形狀時,我們需要修改工廠類別。


具體問題和實現

1. 增加新產品時,需要修改工廠。

public class ProductFactory{
  public Product createProduct(String ProductID){
    if (id==ID1)
      return new OneProduct();
    if (id==ID2) 
      return new AnotherProduct();
    ... // so on for the other Ids
      
    return null; //if the id doesn't have any of the expected values
  }
  ...
}

   

一般我們透過if語句判斷產品描述,並實例化不同的產品,有新的產品時,我們需要增加新的判斷。透過抽象工廠模式可以解決這個問題。

總結

1. 當你確實需要工廠模式時才使用,不然只是增加程序的複雜度,比如多種對像有相似的基本類型時,可以考慮使用簡單工廠模式來統一創建對象。

2. 簡單工廠有比較多的判斷分支語句,違反了開閉原則的對修改關閉的原則,所以,明智的做法是,對一些固定和簡單程序使用簡單工廠模式,對一些複雜和需要經常擴展的程序,使用抽象工廠模式或工廠方法模式。


更多淺析Java設計模式編程中的單例模式和簡單工廠模式相關文章請關注PHP中文網!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

解釋平台獨立性和跨平台發展之間的差異。解釋平台獨立性和跨平台發展之間的差異。Apr 26, 2025 am 12:08 AM

PlatformIndependendecealLowsProgramStormonanyPlograwsStormanyPlatFormWithOutModification,而LileCross-PlatFormDevelopmentRequiredquiresMomePlatform-specificAdjustments.platFormIndependence,EneblesuniveByjava,EnablesuniversUniversAleversalexecutionbutmayCotutionButMayComproMisePerformance.cross.cross.cross-platformd

即時(JIT)彙編如何影響Java的性能和平台獨立性?即時(JIT)彙編如何影響Java的性能和平台獨立性?Apr 26, 2025 am 12:02 AM

JITcompilationinJavaenhancesperformancewhilemaintainingplatformindependence.1)Itdynamicallytranslatesbytecodeintonativemachinecodeatruntime,optimizingfrequentlyusedcode.2)TheJVMremainsplatform-independent,allowingthesameJavaapplicationtorunondifferen

為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

See all articles

熱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

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

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具