我想知道,如何使用带有接口的单例模式?我创建了一个界面:
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
答案 0 :(得分:10)
您提供的代码有点混乱。
控制单例类实例化的重点意味着您必须隐藏构造函数,因此客户端无法访问它并随意创建新实例。
您的工厂方法(创建类实例的方法)getInstance()
是一个实例方法。您必须创建BusinessService
的新实例才能创建BusinessService
的实例 - 很明显,它无法正常工作。
您有几种方法可以处理您的情况:
从您的界面中删除getInstance()
方法,并将其作为静态方法在您的实现类中公开。您还应该将构造函数的可见性限制为private
。
public class BusinessServiceImpl implements BusinessService {
public static BusinessServiceImpl getInstance() {
// instantiation logic
}
private BusinessServiceImpl() {
// constructor logic
}
}
使用工厂类实例化服务并控制实例数。这包括同时删除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
}
}
使用枚举来处理单例逻辑。从界面中删除getInstance()
方法。
public enum BusinessServiceImpl implements BusinessService {
INSTANCE;
// implement the methods from your interface
}