使用Singleton和接口Java

时间:2016-08-22 08:28:13

标签: java interface singleton

我想知道,如何使用带有接口的单例模式?我创建了一个界面:

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 - 依赖注入!

Greets,Mira

1 个答案:

答案 0 :(得分:10)

您提供的代码有点混乱。

控制单例类实例化的重点意味着您必须隐藏构造函数,因此客户端无法访问它并随意创建新实例。

您的工厂方法(创建类实例的方法)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
    }