2010-09-30 49 views
4

最近我想出了动态创建对象的简单模式的想法。我真的很喜欢它。
我相信那个“轮子”是被发明和命名的。有人可以指出一些GOF模式吗?动态对象创建模式 - 我爱

问题:我不想在开始时初始化大量对象。全部都是一个类的实例。 ({“str1”,obj1},{“str2”, OBJ 2},...) 当请求带有STR1我需要返回OBJ1,...
我能有(伪)

if(str == str1) 
    return new Obj(obj1_init_params); 
else if(str == str2) 
    return new Obj(obj2_init_params); 

...

不过是这样的:

  1. 低效 - 在条件满足的情况下完成。
  2. 丑陋:)

为了解决1.你可以使用地图:

map.put(str1, new Obj(obj1_init_params)) 
map.put(str2, new Obj(obj2_init_params)) 

则:

map.get(str1) 

这是快速的解决方案,但所有一次不是按需创建。所以....

创建一个包装接口:

IWrapper { 
    Obj getObj(); 
} 

然后,我把它放在地图:

map.put("str1", new IWrapper(){Obj getObj() {return new Object(object1_params)}; 

现在我在家里:

  1. 快速:地图获得( “STR1”)getObj();
  2. Dynamic - getObj()< - 创建对象被推迟。

这是如此简单,很好,有人之前命名它。 我是java程序员,所以在这里工作很好。你能带来类似的优雅解决方案吗?

+3

我投票,因为找工作的优化代码属于在代码审查,关闭这一问题作为题外话,不堆栈溢出。 – TylerH 2017-03-01 20:13:40

+0

@TylerH是什么让你回顾这6年以上。老问题?只是好奇 – OscarRyz 2017-03-01 23:08:04

+1

@OscarRyz http://meta.stackoverflow.com/questions/341843/should-we-burninate-software-engineering过去〜40天里,在这个问题中使用的标签上正在进行一次刻录工作。我们用它来回顾问题,并确定它们在标记本身之前是否在话题上。 – TylerH 2017-03-02 15:51:47

回答

4

编辑我把“what”和“how”混合在一起。

你实现什么? A lazy initialization如何你是否已经实现了它?通过Factory pattern(许多人已经写过)。

UPDATE您可以使用标准Callable接口而不是IWrapper

map.put(str, new Callable<Obj>() { Obj call() { return new Obj(str); } }); 
+4

一个懒惰的工厂:) – 2010-09-30 07:45:03

+0

非常好的解释,通常我知道工厂,懒惰的评价(这吓坏了我一如既往,我的第一个想法是辛格尔顿模式 - 我开始讨厌)。但我无法将我的概念融入其中,因为它是两者的组合。简单的“什么”和“怎么样”的观点让所有人都清楚!非常感谢! – Gadolin 2010-09-30 09:16:57

+0

@Gadolin我添加了一个关于'Callable'接口的说明。 – Bolo 2010-10-07 08:49:17

1

这是一个工厂模式:http://en.wikipedia.org/wiki/Factory_pattern

工厂模式是软件开发用于封装参与创建的对象的处理的造物设计模式。 创建对象通常需要复杂的过程,不适合包含在组合对象中。

对象的创建可能会导致代码的重复,可能需要组成对象无法访问的信息,可能无法提供足够的抽象级别,或者可能不会成为组成对象关注的一部分。

一些在创建的对象的所需的过程的包括确定哪个对象创建,管理对象的生存期,和管理对象的专门积聚和拆除的担忧。

1

至于其他以前说过,这被称为“Factory pattern”。做好自己的想法。

如果你想借此一步,创建一个地图,只包含类名(一个字符串)。这使您可以从文件中读取名称,最后以“Inversion of Control”结尾,导致“Dependency Injection”。