- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想首先说明我的问题源于 Java 中的接口(interface)不允许静态方法这一事实。在 SO(例如 here)上已经讨论过这个原因。所以我们不要详述这一点。我正在为我的接口(interface)寻找一种方法来创建它自己的实例(而不是它的实现)并返回它。尽管玩弄了单例模式、工厂模式和抽象工厂模式,但我仍然无法实现我的目标。
详细说明我正在尝试什么 - 这是我的界面:
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
接口(interface)表示)请注意,如果我使用工厂模式或其他类似模式,我可以为每个平台提供特定的层。因此,工厂方法/类本身可以知道 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 接口(interface)、创建者模式和 "getInstance()"方法或等效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6811782/
我正在按照本教程创建 Singleton,所有者在以下方法时有评论 http://www.journaldev.com/1377/java-singleton-design-pattern-best-
package com.example.vivanksharma.firebase; import android.support.v7.app.AppCompatActivity; import a
自从首次引入它来替换 Date 以来,我一直在使用静态方法 Calendar.getInstance() 来获取新的 Calendar目的。我从来没有遇到过问题,但出于某种原因我只是想知道使用 Gre
我正在使用适用于 Windows 8 的 MVVM Light 第 4 版;它包括 SimpleIOC。在各种示例中,我有时会看到基于 SimpleIoc 请求对象的代码......有时它基于 Ser
我看过这个post关于注册泛型类型。 如何注册的示例: bind(new TypeLiteral>() {}).to((Class>) ResponseDal.class); 但是如何从注入(inj
我想在我的 unitTest 中从 Guice injector 注入(inject)一个实例。 我可以使用哪个微分器? 我知道构造函数参数中使用了@annotation机制 但是 junit 不允许
我正在使用静态实例对象来获取与应用程序中另一个 Activity 相关的数据。但这会导致内存泄漏。 public class ChartActivity extends AppCompatActivi
以前用过C#,我考虑过 Calendar cal = Calendar.getInstance(); 根据 GoF 成为单例方法 Singleton pattern (Wikipedia)我想知道如何
我很难找到以对性能最友好的方式使用单例类的正确方法。我有 3 种方法,也许有人可以向我解释最有效的方法: 1: public functionA() { SingletonClassA.get
最近我阅读了一些使用广泛遵循 getInstance() 方法的 C++ 代码: class S { private: int some_int = 0; public
许多公开可用的 Java API 似乎都使用 getInstance 来生成和返回对象。我很好奇为什么会这样——为什么不直接使用默认/参数化构造函数呢? 是否有关联的设计模式? 最佳答案 我建议阅读
我遇到过单例模式。我无法理解 singletonobj.getinstance().dosomething() //1st one 和 singletonobj.dosomething() //2nd
getInstance() 在 Java 中的作用是什么? 在我的研究过程中,我一直在读到 getInstance() 有助于实现单例设计模式(据我了解,这意味着整个程序中只有一个实例)。但是我不能只
Firebase Firestore 提供 getInstance()方法,它打开一个套接字(在应用程序执行的任何时候只有一个)并实例化 Firestore 客户端。 我想查询和存储数据,使用或不使用
我正在将一个表单组件放入 joomla.In 中,我将在其中放置一个文本框、一个编辑器和一个按钮。 我为此表单创建了 View 文件,并且组件已成功安装。但是当我单击以在前端显示此表单时,会出现如下错
我正在尝试跟踪人们是否从广告或其他地方找到了我的 Android 应用。所以我发现谷歌分析可以通过这个表单生成的精心构建的 url 来跟踪它: http://code.google.com/mobil
我观看了此视频(https://www.youtube.com/watch?v=idb6hOxlyb8),该视频是2013年8月上传的。它声称我们应该使用 ptor.get(url) 而不是 brow
创建 google-service.json 后运行示例时,应用在尝试在 SignInActivity 中获取数据库引用时崩溃 mDatabase = FirebaseDatabase.getInst
基于以下问题:Decimal point or decimal comma in Android我尝试获取设备中使用的小数点分隔符。我正在使用Kotlin,因此我的代码如下所示: import and
从 Fabric Crashlytics 迁移到 FirebaseCrashlytics SDK 后,我在另一个进程(不是主进程)上遇到了一些崩溃。 当在 Activity 中调用 FirebaseC
我是一名优秀的程序员,十分优秀!