相关疑难解决方法(0)

如何创建灵活的插件架构?

我的开发工作中的一个重复主题是使用或创建内部插件架构.我已经看到它涉及多种方式 - 配置文件(XML,.conf等),继承框架,数据库信息,库等.在我的经验中:

  • 数据库不是存储配置信息的好地方,尤其是与数据混合在一起
  • 尝试使用继承层次结构需要了解要编码的插件,这意味着插件架构不是那么动态
  • 配置文件适用于提供简单信息,但无法处理更复杂的行为
  • 库似乎运行良好,但必须仔细创建单向依赖.

当我试图从我曾经使用过的各种架构中学习时,我也在寻求社区的建议.您是如何实现SOLID插件架构的?你最糟糕的失败是什么(或者你看到的最严重的失败)?如果要实现新的插件架构,您会怎么做?您使用过的SDK或开源项目是否具有良好架构的最佳示例?

我自己找到的几个例子:

这些例子似乎发挥了各种语言优势.一个好的插件架构是否必然与语言相关?最好使用工具来创建插件架构,还是在自己的以下模型上进行?

language-agnostic architecture plugins plugin-architecture

149
推荐指数
7
解决办法
6万
查看次数

使用Java构建插件系统的最佳方法

您将如何为Java应用程序实现插件系统?

是否可以使用易于使用(对于开发人员)系统,实现以下目标:

  • 用户将他们的插件放入应用程序的子目录中
  • 插件可以提供配置屏幕
  • 如果您使用框架,许可证是否与商业开发兼容?

java plugins frameworks design-patterns plugin-architecture

142
推荐指数
7
解决办法
9万
查看次数

没有switch语句的Java工厂

我正在尝试构建一个工厂对象,但是在使用Java编写一个很好的方法时遇到了麻烦.

我正在编写的应用程序用于处理各种格式的文件,因此有一个CodecInterface适用于所有用于读写文件的类.我们假设它定义了以下方法.这些文件中的每一个都具有唯一的人指定ID字符串,用于id'编码器\解码器.

String read();
void write(String data);
String getID();
Run Code Online (Sandbox Code Playgroud)

工厂类将有一个create方法,用于创建这些编解码器类的实例.我想方法签名看起来像这样.

static CodecInterface CodecFactory.create(String filename, String codecid, String args);
Run Code Online (Sandbox Code Playgroud)

filename是要读/写的文件的名称,codecid是指示要使用的编解码器的唯一ID.args参数是传递给正在生成的解码器/编码器对象的参数字符串.返回的应该是所请求的编解码器对象的实例.

我见过的所有Factory示例通常在create方法中都有一个switch语句,它创建一个依赖于ID的对象实例.我想避免这样做,因为它似乎不是'正确'的方式,它也意味着除非你修改create方法,否则列表或多或少是固定的.理想情况下,我想使用像字典(由编解码器ID索引)的东西,其中包含可用于创建我想要的编解码器类的实例的东西(我将称之为神秘类ClassReference).再次使用一些准java代码,这是我正在考虑的创建方法的主体.

static Dictionary<String, ClassReference>;

static CodecInterface CodecFactory.create(String filename, String codecid, String args);
{
    ClassReference classreference;

    classreference = codeclibrary(codecid);

    return classreference.instanceOf(args);
}
Run Code Online (Sandbox Code Playgroud)

ID的字典很容易,但我无法弄清楚ClassReference应该是什么.类引用应该允许我创建所需类的实例,如上例所示.

从在线浏览,类方法和instanceOf似乎朝着正确的方向前进,但我没有发现任何将两者结合在一起的东西.作为一个额外的复杂性,正在创建的对象的构造函数将具有参数.

任何关于我应该看的内容的提示都将不胜感激.

提前致谢.

谢谢大家的意见.我最终从你的所有建议中得到了点点滴滴,并提出了以下似乎按我的意愿工作的内容.

请注意,我已经省略了很多sanity\error检查代码以显示重要位.

import java.lang.reflect.Constructor;
import java.util.HashMap;

public class CodecFactory
{
    private static HashMap<String, Class<? extends CodecInterface>> codecs;

    static
    {        
        codecs = new HashMap<String, Class<? extends CodecInterface>>();

        //Register built-in codecs here
        register("codecA", CodecA.class);
        register("codecB", CodecB.class);
        register("codecC", …
Run Code Online (Sandbox Code Playgroud)

java factory

8
推荐指数
2
解决办法
3461
查看次数

为J2SE应用程序添加插件支持的最佳技术?

我正在编写一个J2SE桌面应用程序,需要其中一个组件可插拔.我已经为这个插件定义了Java接口.用户应该能够在运行时(通过GUI)选择他们想要使用的这个接口的实现(例如在初始化对话框中).我设想将每个插件打包为一个JAR文件,其中包含实现类以及它可能需要的任何帮助程序类.

在桌面Java应用程序中执行此类操作的最佳技术是什么?

java plugins plugin-architecture

5
推荐指数
1
解决办法
1267
查看次数