Java接口,创建者模式和“getInstance()”方法或等效方法
作者:互联网
我想首先提一下,我的问题源于Java中的接口不允许静态方法.关于SO的原因(例如here)已有讨论.所以不要纠缠于此.我正在寻找一种方法让我的界面创建自己的实例(而不是它的实现)并返回它.尽管使用了Singleton模式,Factory和AbstractFactory模式,我仍然无法实现我的目标.
详细说明我正在尝试的内容 – 这是我的界面:
public interface NoteDataStore {
public boolean deleteNote(long noteId);
public boolean addNote(Note note);
public List<Note> listNotes();
public boolean editNote(long noteId, Note note);
public List<Note> search(String searchString);
}
这是我的业务逻辑层:
public class BusinessLogicLayer {
public BusinessLogicLayer(){
/*
* GOAL: To get an instance of NoteDataStore here,
* without being aware of the implementation class.
*/
}
}
我尝试使用像这样的工厂模式:
public interface NoteDataStoreFactory {
public NoteDataStore getDataStoreInstance();
}
public class NoteDataStoreFactoryImpl implements NoteDataStoreFactory{
public NoteDataStore getDataStoreInstance(){
return NoteDataStoreImpl.getInstance();
/*
* Here, NoteDataStoreImpl is an implementation of NoteDataStore.
* This should be transparent to my business logic layer.
*/
}
}
但是,这仍然需要业务逻辑层知道实现类NoteDataStoreFactoryImpl,因此:
NoteDataStore = new NoteDataStoreFactoryImpl().getDataStoreInstance();
我该如何解决这个问题?对于要使用的确切实现类,如何让我的BusinessLogicLayer陷入困境?
编辑:更详细的问题背景
一些答案建议使用像Spring这样的框架.唉,我不能这样做,因为这个应用程序针对各种移动平台(Android,Blackberry,JavaME).我应该在我最初的问题中明确表达这一点 – 对于不这样做表示道歉.
我的主要目的是跨平台创建一个应用程序. UI,数据库访问,HTTP传输层等必须专门为每个平台编码.但是,业务逻辑非常简单,可以保证所有平台上的公共层.我打算将业务逻辑层分发为JAR库.同样,解析和框架层(用于JSON / XML).
在SO上已经讨论了这个问题(关于我是否应该沿着这条路走下去) – Logic Code reuse.但是,假设这是正常的,我继续采用分层方法,并打算在代码中使用一层通用.现在,我的情况是这样的:
>通用业务逻辑层.
>特定于平台的数据层(由NoteDataStore接口表示)
>特定于平台的应用程序核心层(控制器,如果我可以这样称呼它).
请注意,如果我使用工厂模式或其他类型,我可以负担得到每个平台特定的图层.因此,工厂方法/类本身可以了解NoteDataStore实现类.但是,业务逻辑层必须不知道任何实现类.
各层的典型用途如下:
public class NoteDataStoreAndroid implements NoteDataStore{
public boolean deleteNote(long noteId){
/*
* Android-specific database code
*/
}
/* ... similarly, other methods */
}
public class AndroidCoreApp{
public void doBusinessLogic(){
BusinessLogicLayer businessLogic = new BusinessLogicLayer();
businessLogic.startBusinessLogic();
}
}
关于如何处理这种情况的任何输入?
解决方法:
你的班级应该从外面接受工厂实例.当你自己创建实例时 – 你什么都没做,你在这里是正确的.
这里有几种技术.一般来说,它们属于一般称为Inversion of Control或IoC的东西.了解“控制容器的反转”或IoCC也很有用. Java以Spring为例 – 阅读here.你应该向真正的Java人员询问其他人:)
另外看看这个article.
标签:java,design-patterns,abstract-factory 来源: https://codeday.me/bug/20190614/1236414.html