簡體   English   中英

使用Singleton和接口Java

[英]Using Singleton with Interfaces Java

我想知道,如何使用帶有接口的單例模式? 我創建了一個界面:

public interface BuisinessService {

   BuisinessService getInstance();

}

我做了這個實現:

public class BuisinessServiceImpl implements BuisinessService {

  private static BuisinessServiceImpl instance = null;

  private BuisinessServiceImpl(){ }

  @Override
  public BuisinessServiceImpl getInstance() {
    if (instance == null) {
        BuisinessServiceImpl.instance = new BuisinessServiceImpl();
    }
    return BuisinessServiceImpl.instance;
  }
}

如何從我的主類訪問getInstance? 我嘗試了一些想法

private BuisinessService service = new BuisinessServiceImpl();

(不起作用 - BuisinessServiceImpl()的構造函數是私有的)

但還有什么? 你能幫我嗎?

編輯 :我正在使用Java Spring! 我不想使用Java Springs - 依賴注入!

招呼,米拉

你提供的代碼有點混亂。

控制單例類實例化的重點意味着您必須隱藏構造函數,因此客戶端無法訪問它並隨意創建新實例。

您的工廠方法(創建類實例的方法) getInstance()是一個實例方法。 您必須創建一個新的BusinessService實例才能創建BusinessService實例 - 很明顯,它將無法正常工作。

您有幾種選擇來處理您的情況:

  1. 從接口中刪除getInstance()方法,並將其作為靜態方法在實現類中公開。 您還應該將構造函數的可見性限制為private

     public class BusinessServiceImpl implements BusinessService { public static BusinessServiceImpl getInstance() { // instantiation logic } private BusinessServiceImpl() { // constructor logic } } 
  2. 使用工廠類實例化服務並控制實例數。 這包括一起刪除getInstance()方法並將BusinessServiceImpl類的可見性限制為package

     class BusinessServiceImpl implements BusinessService { BusinessServiceImpl() { // constructor logic } } // should be in the same package as BusinessServiceImpl public final class BusinessServiceFactory { private BusinessServiceImpl instance; public BusinessService getInstance() { // instance creation logic, same as singleton creation logic } } 
  3. 使用枚舉來處理單例邏輯。 從界面中刪除getInstance()方法。

     public enum BusinessServiceImpl implements BusinessService { INSTANCE; // implement the methods from your interface } 

暫無
暫無

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

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