是否有任何创建设计模式来实例化新编写的类?

时间:2016-05-05 23:18:22

标签: object design-patterns

是否有任何创建设计模式允许实例化全新对象(如新编写的那样),而无需在现有代码中的某处添加new语句?

2 个答案:

答案 0 :(得分:1)

我在这里想到的一件事是,有人需要为你新写的班级做new。如果你不这样做,那么可能需要一些框架来做到这一点。

我记得我在使用Java Spring的一个副项目中做过类似的事情。我有一个接口和多个实现。我的项目需要迭代所有实现做一些处理。现在为此我甚至寻找一些解决方案,我不必手动执行该特定类的实例化或该特定类的一些显式连接。所以Spring帮助我通过@Autowired注释来做到这一点。它动态地注入了该接口的所有实现。例如: -

@Autowired
private List<IMyClass> myClassImplementations;

现在在上面的示例中,我可以简单地遍历注入的实现列表,每次编写新实现时都不需要对新实现进行实例化。

但我认为在大多数情况下使用这种方法很困难(即使它符合我的情况)。在一般情况下,我宁愿使用Factory模式,并尝试使用它来创建新实例。我知道这需要新的,但在我的看法中,它的工程方式是自动创建和注入的对象有点额外的开销。

答案 1 :(得分:1)

要解决的主要问题是如何识别要实例化的类。我知道并且已经使用了三种通用模式来发现类,我将按类型调用注册,自注册和发现。我不知道它们是用正式的模式描述写的。

注册:每个想要被发现的类都注册在框架可以找到它的地方:

  • 类名放在环境变量或Java系统属性,文件等中。
  • 一些代码在程序执行的早期将类或其名称添加到单个列表中

自行注册:每个想要被发现的类都可以在单例列表中注册自己。诀窍是班级如何知道何时这样做。

  • 可能必须在程序早期的某些代码中明确引用该类(例如the old way of choosing a JDBC driver)。
  • 在Ruby中,定义类的代码可以在定义类时在某处注册类(或执行任何其他操作)。它足以require包含该类的文件。

按类型发现:每个要发现的类都会扩展或实现框架定义的类型,或者以特定方式命名。 Spring自动装配类注释是此模式的另一个版本。

有几种方法可以在Java(here's one SO questionhere's another)和Ruby中查找来自给定类型的类。与自注册一样,在类动态加载类的语言中,必须要做的事情是确保在向运行时询问可用的类之前加载类。