![](/img/trans.png)
[英]Why is there no InputManager.getInstance() for me? And injectInputEvent()?
[英]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模式的一種情況。 使用它的最常見原因是:
這些原因之間存在一些重疊。 事實上,通常所有四個都適用。 部分特化(4)幾乎需要解耦類型和實現(3)。
“為什么不只是使用默認/參數化構造函數”,因為在調用構造函數時 ,確保Singleton Pattern約束只有一個實例已經太晚了。 重點是對單個實例進行受控訪問並避免多個實例。 唯一的方法是使用訪問修飾符來防止構造函數被訪問。
如上所述,提供簡單/安全的解決方案是一些模式設計“要求”的問題。
但是你應該盡可能避免在動態實例化方面使用“getInstance”(java.lang.Class.getInstance()'和'java.lang.Class.NewInstance()'),因為動態實例化比常規的類調用或方法調用。
僅在必要時使用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.