gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:25:41 26 4
gpt4 key购买 nike

我希望这不是太具体。

我创建了一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com