簡體   English   中英

為什么要使用getInstance

[英]why use getInstance

很多公開的Java API似乎都使用getInstance來生成和返回一個對象。 我很好奇為什么會這樣 - 為什么不使用默認/參數化構造函數呢?

是否有相關的設計模式?

我建議閱讀Joshua Bloch撰寫的“Effective Java”,第1項“考慮靜態工廠方法而不是構造函數”。 他領導了眾多Java平台功能的設計和實現,他知道為什么。

它與Singleton Pattern相關聯。

很多時候,還有工廠方法可以幫助您創建對象。

例如: Boolean.parseBoolean("true");

工廠方法的優點是它們比一系列構造函數更加冗長和易於掌握。

另一個例子(除了單例或多噸模式)是你需要在構造函數中做一些通常不推薦的事情,比如注冊一個監聽器或啟動一個線程:

class Whatever {

    private Whatever() {} //private constructor
    public Whatever getInstance() {
        Whatever w = new Whatever();
        startSomeThread();
        return w;
    }
}

是的....它與Factory和Singleton模式相關聯。 工廠模式用於將對象創建邏輯與業務邏輯分離,而Singleton模式用於在整個應用程序中僅維護對象的單個實例。

為了省去查找具體原因的麻煩......

這是Factory Method模式的一種情況。 使用它的最常見原因是:

  1. 如果構造太復雜而無法在構造函數中處理
  2. 如果構造需要構造函數中不允許或不需要的操作
  3. 將產品類型(“接口”)與實際實現(“類”)分離。
  4. 出於性能或架構原因,例如在施工時執行部分專業化
  5. 為了清晰/可讀性

這些原因之間存在一些重疊。 事實上,通常所有四個都適用。 部分特化(4)幾乎需要解耦類型和實現(3)。

“為什么不只是使用默認/參數化構造函數”,因為在調用構造函數 ,確保Singleton Pattern約束只有一個實例已經太晚了。 重點是對單個實例進行受控訪問並避免多個實例。 唯一的方法是使用訪問修飾符來防止構造函數被訪問。

如上所述,提供簡單/安全的解決方案是一些模式設計“要求”的問題。

但是你應該盡可能避免在動態實例化方面使用“getInstance”(java.lang.Class.getInstance()'和'java.lang.Class.NewInstance()'),因為動態實例化比常規的類調用或方法調用。

僅在必要時使用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM