gpt4 book ai didi

java - 没有 switch 语句的 Java 工厂

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:00 25 4
gpt4 key购买 nike

我正在尝试构建一个工厂对象,但无法找到在 Java 中执行此操作的好方法。

我正在编写的应用程序用于处理各种格式的文件,因此有一个 CodecInterface 适用于所有用于读取和写入文件的类。让我们假设它定义了以下方法。这些文件中的每一个都有一个唯一的人为指定的 ID 字符串,用于识别编码器\解码器。

String read();
void write(String data);
String getID();

工厂类将有一个 create 方法,用于创建这些编解码器类的实例。我想方法签名看起来像这样。
static CodecInterface CodecFactory.create(String filename, String codecid, String args);

filename 是要读/写的文件的名称,codecid 是唯一 ID,指示要使用的编解码器。 args 参数是传递给正在生成的解码器/编码器对象的参数字符串。 this 的返回应该是请求的编解码器对象的实例。

我见过的所有工厂示例通常在 create 方法中都有一个 switch 语句,该语句创建一个依赖于 ID 的对象实例。我想避免这样做,因为它似乎不是“正确”的方式,这也意味着列表或多或少是固定的,除非您修改 create 方法。理想情况下,我想使用类似字典(由编解码器 ID 索引)之类的东西,其中包含可用于创建我想要的编解码器类的实例(我将这个神秘类称为 ClassReference)的东西。再次使用一些准 java 代码,这里是我认为的 create 方法的主体。
static Dictionary<String, ClassReference>;

static CodecInterface CodecFactory.create(String filename, String codecid, String args);
{
ClassReference classreference;

classreference = codeclibrary(codecid);

return classreference.instanceOf(args);
}

ID 的字典很简单,但我不知道 ClassReference 应该是什么。类引用应该允许我创建所需类的实例,如上例所示。

从网上环顾四周,类方法和 instanceOf 似乎朝着正确的方向前进,但我没有找到将两者结合在一起的任何东西。作为一个额外的复杂因素,正在创建的对象的构造函数将具有参数。

关于我应该看什么的任何提示将不胜感激。

提前致谢。

解决方案

谢谢大家的建议。我最终从您的所有建议中汲取了点点滴滴,并提出了以下似乎可以正常工作的建议。

请注意,我省略了大部分健全性\错误检查代码来展示重要的部分。
import java.lang.reflect.Constructor;
import java.util.HashMap;

public class CodecFactory
{
private static HashMap<String, Class<? extends CodecInterface>> codecs;

static
{
codecs = new HashMap<String, Class<? extends CodecInterface>>();

//Register built-in codecs here
register("codecA", CodecA.class);
register("codecB", CodecB.class);
register("codecC", CodecC.class);
}

public static void register(String id, Class<? extends CodecInterface> codec)
{
Class<? extends CodecInterface> existing;

existing = codecs.get(id);
if(existing == null)
{
codecs.put(id, codec);
}
else
{
//Duplicate ID error handling
}
}

public static CodecInterface create(String codecid, String filename, String mode, String arguments)
{
Class<? extends CodecInterface> codecclass;
CodecInterface codec;
Constructor constructor;

codec = null;

codecclass = codecs.get(codecid);
if(codecclass != null)
{
try
{
constructor = codecclass.getDeclaredConstructor(String.class, String.class, String.class, String.class);
codec = (CodecInterface)(constructor.newInstance(codecid, filename, mode, arguments));
}
catch(Exception e)
{
//Error handling for constructor/instantiation
}
}

return codec;
}
}

最佳答案

尝试这样的事情:

public class CodecFactory {
final private static Map<String, Class<? extends CodecInterface>> codecLibrary;

static {
codecLibrary = new HashMap<String, Class<? extends CodecInterface>>();
codecLibrary.put("codec1", Codec1.class);
//...
}

static CodecInterface create(String filename, String codecid, String args) throws InstantiationException, IllegalAccessException {
Class<? extends CodecInterface> clazz;

clazz = codecLibrary.get(codecid);

CodecInterface codec = clazz.newInstance();

codec.setArgs(args);
codec.setFilename(filename);

return codec;
}
}

关于java - 没有 switch 语句的 Java 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22314256/

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