簡體   English   中英

單例模式,配置和依賴注入

[英]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對象的引用。

所以我需要一個允許我執行以下操作的設計:

  1. 使我的Java類具有唯一性(Singleton模式)
  2. 注入我的Connection對象
  3. 使用配置文件配置我的班級

有任何想法嗎?

對於前兩點,這樣的方法可以解決問題:

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;
}

此實現違反了單例原則。 考慮使用兩種惰性初始化方法之一:

  1. 帶有同步關鍵字public synchronized static Connection getInstance() { ... }

  2. 按需初始化持有人慣用法。

     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.

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