我有一个库/ android模块,提供某些自定义ui类。 (PanelView,GridView,TextView ...)所有这些类都是可设置的。样式从文本文件解析为JSONObjects,在StyleManager中组织,然后从中检索并转换为样式对象。第一个想法就像是
public class PanelView_Styling{
public static PanelView_Styling createFromJSON(JSONObject data){...}
}
但是我不能使用包含创建方法的Styling接口。 (在Java 8之前的接口中没有静态方法。)
下一个选择是工厂
public class StylingFactory{
public static Styling createStylingFromJSON(int stylingType, JSONObject data){
switch( stylingType ){
case 0:
/* get and validate attributes from data */
/* return null or new Styling instance filled with the attributes */
break;
}
}
int typecheck只是一个例子。它可以是类引用,枚举,甚至是样式数据的属性或不同的东西
但这种方法的主要问题是,我不能在不改变工厂的情况下添加新的样式。当我在另一个内部使用ui模块时,我会在某个时刻有ExtendedPanelView
和ExtendedPanelView_Styling
。 Styling将拥有自己的参数验证逻辑,因此我不能只使用反射并将JSON中的所有内容复制到样式中。
我认为抽象工厂可能是一个解决方案。我会在lib中有一个基本的ui元素和样式的具体工厂。然后我必须在每个具有额外UI元素和样式的模块中实现自定义工厂。然后在一个实例下组合具体工厂的实例,并以某种方式确定哪个工厂能够创建哪种类型的样式。 (也许只是调用它们中的每一个直到一个返回一个对象,或者它们都失败了) 但这似乎相当复杂。对这个问题有更简单,更直接的方法吗?