[英]Singleton Pattern, Configuration and Dependency Injection
我目前正在將C庫移植到Java。 C庫連接到外部設備,並提供配置設備和接收數據的功能。 我設計的核心是一個Connection
類,該類封裝到設備的連接並提供使用JNA生成的低級C API映射。
由於大多數C庫不能很好地將其轉換為Java的OO-World(包含100多個函數的單個標頭庫),所以我有幾個“ Manager”類可提供對大多數功能的訪問。
創建多個此類都不是沒有道理的,因為C庫僅管理所有資源的一種(配置,數據緩沖區等)。 所以我想為我的Java類實現Singleton模式(有效地還向新Java庫的用戶發出信號,即整個系統中只有一個Manager Manager對象)。
另外,我希望能夠使用外部配置文件配置這些Manager類。 我以前從未實現過配置實用程序,所以我真的不知道該放在哪里。
最后,我所有的Manager類都需要對Connection
對象的引用。
所以我需要一個允許我執行以下操作的設計:
Connection
對象 有任何想法嗎?
對於前兩點,這樣的方法可以解決問題:
public class Connection{
private static Connection instance = null;
private String connectionString;
protected Connection() {
}
public static Connection getInstance() {
if(instance == null) {
instance = new Connection();
}
return instance;
}
public void setConnectionString(String connectionString){
this.connectionString = connectionString;
}
public String getConnectionString(){
return this.connectionString;
}
}
這是Java中單例的經典示例。 構造函數protected
,因此您不能使用new
關鍵字實例化它。 相反,您可以這樣使用它:
Connection con = Connection.getInstance();
getInstance()
負責實例化,並確保單例僅存在一個實例。 例如,這:
Connection con = Connection.getInstance();
con.setConnectionString("foobar");
Connection con2 = Connection.getInstance();
System.out.println(con2.getConnectionString());
將打印foobar
對於第三點,我想請您看看這個問題,它已經有了答案。
public static Connection getInstance() {
if(instance == null) {
instance = new Connection();
}
return instance;
}
此實現違反了單例原則。 考慮使用兩種惰性初始化方法之一:
帶有同步關鍵字public synchronized static Connection getInstance() { ... }
按需初始化持有人慣用法。
public final class Connection { private static class Holder { private static final Connection INSTANCE = new Connection(); } private Connection() {} public static Connection getInstance() { return Holder.INSTANCE; } }
為此,按需初始化持有者慣用語是一個惰性同步Singleton,並且比具有同步關鍵字的第一個解決方案性能更高。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.