java - 使用 xml 中的抽象工厂模式动态选择要创建的对象

标签 java xml xsd abstract-factory

我希望这不是太具体。

我创建了一个 XML 架构,我使用 XJC 对其进行编译以获取类。 XML 基本上表示表单的一些元素(如文本字段、标签等)。 以下是摘录:

<gruppoOggetti id="string" nome="string">
        <oggetto xsi:type="labelType" etichetta="string" id="string" obbligatorio="false" />
        <oggetto xsi:type="listaOpzioni" id="string" obbligatorio="1">
            <opzione id="string">string</opzione>
        </oggetto>
        <oggetto xsi:type="imageType" etichetta="string" id="string" obbligatorio="0" />
    </gruppoOggetti>

如您所见,对象的类型是从属性 xsi:type 定义的,因此当我使用 jaxb 解压 xml 时,它会自动实例化正确的类。

现在问题是: 我正在实现一个抽象工厂来创建对象,所以基本上我必须根据 xml 指示我必须创建的对象来调用工厂的不同方法。 我现在使用的不太令人满意的方法是:

public OggettoBase creaOggetto(Factory f, OggettoType oggetto)
{
    String tipo = oggetto.getClass().getSimpleName().toString();
    OggettoBase ret = null;
    switch(tipo)
    {
        case "CheckBoxType": ret = f.createCheckbox(); break;
        case "ImageType":ret = f.createImage(); break;
        case "LabelType":ret = f.createLabel(); break;
        case "LinkType": ret = f.createLink(); break;
        case "ListaOpzioni": ret = f.createLista(); break;
        case "PasswordType": ret = f.createPassword(); break;
        case "RadiobuttonType": ret = f.createRadiobutton(); break;
        case "TextareaType": ret = f.createTextarea(); break;
        case "TextfieldType": ret = f.createTextfield(); break;
        default : System.out.println("Il tipo: "+tipo+" non esiste");
    }
    return ret;
}

我想使用其他方法(编辑:而不是 switch/case),我正在考虑枚举,但我还没有完全实现。另外我不想使用反射。

最佳答案

嗯,对我来说这并不是真正的工厂模式。工厂模式通常与 Strategy Pattern 结合使用。 。所以我的建议是实现你的工厂,以便它只调用 f.CreateObject ,它将返回一个可以调用更通用的 Create() 的对象。这样做的好处是它允许您的方法和类专注于它们特定的 responsibility ,并且任何时候您必须更改一项的功能,那么您就不必重建其他项(如果您有必须对所有项进行更改的通用功能,则可以使用基类)。如果您需要以下详细信息或推理,请告诉我。您甚至可以使 main 方法更加接近您的工厂,并使代码更加美观。

public OggettoBase creaOggetto(OggettoType oggetto)
{
    String tipo = oggetto.getClass().getSimpleName().toString();
    IObjectCreator creator = Factory.GetObjectCreator(tipo);
    if(creator == null)
        return null;
    return creator.Create();
}

public interface IObjectCreator
{
    OggettoBase Create(); 
}

public CheckboxCreator:IObjectCreator
{
    public OggettoBase Create()
    {
        return new Checkbox();
    }
}

//Repeat for each type

public static Factory
{
    public IObjectCreator GetObjectCreator(string tipo)
    {
        IObjectCreator creator;
        switch(tipo)
        {
            case "CheckBoxType": creator = new CheckboxCreator(); break;
            ...
            default : System.out.println("Il tipo: "+tipo+" non esiste");
        }
        return creator;
}
PS。我有 C# 背景,因此如果某些语法不正确,请告诉我。但是,基本原则仍然适用

关于java - 使用 xml 中的抽象工厂模式动态选择要创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9703571/

相关文章:

java - 为什么字节以不同的大小打印为位数组

java - 删除字符串中的单词 (RemoveString)

c# - 返回非常大的字符串时 .asmx 请求超时

c# - 反序列化为 List 仅选取一项

xsd - 在 Xml 架构中向简单类型添加属性或向复杂类型添加限制

xml - 根据 XSD 模式验证 XML 并使用 groovy 捕获验证器期望

java - RX java/Android 我如何使用 debounce 运算符在每次点击时实现 This toast

java - 循环时不接受我输入的 key - Java AWT

xml - 是否有任何正式的方式或已知的方式来规范化 xml 文件以生成差异?

java - 使用通用 Java 工具/api 导航 XSD 和 XML 文件