Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,动态样式类的工厂模式?_Java_Design Patterns - Fatal编程技术网

Java,动态样式类的工厂模式?

Java,动态样式类的工厂模式?,java,design-patterns,Java,Design Patterns,我有一个library/android模块,它提供了某些自定义ui类。(PanelView、GridView、TextView…)所有这些类都是可设置样式的。样式从文本文件解析为JSONObject,组织在样式管理器中,从中检索并转换为样式对象。第一个想法是 public class PanelView_Styling{ public static PanelView_Styling createFromJSON(JSONObject data){...} } 但是我不能使用包含创建方

我有一个library/android模块,它提供了某些自定义ui类。(PanelView、GridView、TextView…)所有这些类都是可设置样式的。样式从文本文件解析为JSONObject,组织在样式管理器中,从中检索并转换为样式对象。第一个想法是

public class PanelView_Styling{
    public static PanelView_Styling createFromJSON(JSONObject data){...}
}
但是我不能使用包含创建方法的样式接口。(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类型检查只是一个例子。它可以是类引用或枚举,甚至是样式数据的属性或其他内容。
但是这种方法的主要问题是,我不能在不改变工厂的情况下添加新的样式。当我在另一个ui模块中使用ui模块时,我会在某个时候使用
ExtendedPanelView
ExtendedPanelView\u样式设置
。样式将有自己的参数验证逻辑,因此我不能只使用反射并将JSON中的所有内容复制到样式中

我认为抽象工厂可能是一个解决方案。对于库中已经存在的基本ui元素和样式,我会有一个具体的工厂。然后,我必须在每个模块中实现一个自定义工厂,该工厂具有额外的ui元素和样式。然后将具体工厂的实例合并到一个实例下,以某种方式找出哪个工厂能够创建哪种类型的样式。(可能只是调用它们中的每一个,直到其中一个返回一个对象,或者它们都失败)。

但这似乎相当复杂。有没有一种更简单、更直接的方法来解决这个问题?

我会想到一种装饰图案,希望你不要问我这里是怎么回事。实际上这听起来不太糟糕。比管理
factorympl
实例列表简单一点。我可以在lib中有一个BaseFactory,在特定的应用程序中有一个decorator工厂。所有基类的创建都是委托的,所有新类都由装饰器处理。将基础工厂作为内部工厂进行管理要比将特定工厂“注入”到基础工厂中稍微容易一些。您的工厂是所谓的混凝土(或简单)工厂,因为不涉及多态性。您可以创建一个具有反射的更动态的工厂(通过名称实例化类,这需要将
styleingtype
映射到Java类型)。一种更实用的方法可能是使用switch/case,如果您发现要花费大量时间修改工厂以实现新的实现(或者您希望用户能够拥有用于样式设置的“插件”),那么请转到带有反射的动态版本。完美是好的敌人。这正是我一直在做的。我在库中有工厂,并用映射填充它
。然后我解析JSON并通过反射创建样式实例。样式接口保证存在
createFromJSON()
。对于自定义组件,我只添加自定义映射,仅此而已。但它需要反射,因此它不太通用。但你说的完美和美好是对的!还是有点不尽如人意。但是,即使映射StyleingCreator实例(如果没有反射)也会比多态工厂感觉更干净,例如,我会想到一个装饰模式,希望你不要问我这里是怎么回事。实际上这听起来并不太糟糕。比管理
factorympl
实例列表简单一点。我可以在lib中有一个BaseFactory,在特定的应用程序中有一个decorator工厂。所有基类的创建都是委托的,所有新类都由装饰器处理。将基础工厂作为内部工厂进行管理要比将特定工厂“注入”到基础工厂中稍微容易一些。您的工厂是所谓的混凝土(或简单)工厂,因为不涉及多态性。您可以创建一个具有反射的更动态的工厂(通过名称实例化类,这需要将
styleingtype
映射到Java类型)。一种更实用的方法可能是使用switch/case,如果您发现要花费大量时间修改工厂以实现新的实现(或者您希望用户能够拥有用于样式设置的“插件”),那么请转到带有反射的动态版本。完美是好的敌人。这正是我一直在做的。我在库中有工厂,并用映射填充它
。然后我解析JSON并通过反射创建样式实例。样式接口保证存在
createFromJSON()
。对于自定义组件,我只添加自定义映射,仅此而已。但它需要反射,因此它不太通用。但你说的完美和美好是对的!还是有点不尽如人意。但即使映射StyleingCreator实例(如果没有反射)也会比多态工厂(例如。