1

我希望这不是太具体。

我创建了一个 XML Schema,我用 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;
}

我想使用另一种方法(编辑:而不是开关/案例),我正在考虑枚举,但我并不完全在那里。我也不想使用反射。

4

1 回答 1

0

好吧,对我来说,这并不是真正的工厂模式。工厂模式通常与策略模式相结合。所以我的建议是实现你的工厂,以便它只调用 f.CreateObject,它将返回一个可以调用更通用 Create() 的对象。这样做的好处是它允许您的方法和类专注于它们的特定职责,并且任何时候您必须更改一项的功能,然后您不必重新构建其他项(如果您有的话,您可以使用基类也必须为所有人更改的通用功能)。如果您需要以下或推理的更多详细信息,请告诉我。您甚至可以使 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# 背景,所以如果某些语法不正确,请告诉我。但是,基本原则仍然适用

于 2012-03-14T14:14:05.320 回答