动态对象创建模式 - 我喜欢

时间:2010-09-30 07:23:23

标签: design-patterns oop

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

问题:有大量的对象我不希望在开始时全部初始化。所有都是一个班级的实例。

我想使用一个对象,然后释放内存(或允许垃圾回收), 每个对象都与某个字符串相关,所以我有一个地图({“str1”,obj1},{“str2”,obj2},...) 当请求带有str1时,我需要返回obj1,....
我可以(伪代码)

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

...

然而,这是:

  1. 效率低下 - 如果条件允许的话。
  2. 丑:)
  3. 要解决1.你可以使用map:

    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. 快速:map.get(“str1”)。getObj();
    2. 动态 - getObj()< - 对象的创建被推迟。
    3. 这是如此简单,很好,有人以前命名过它。 我是java程序员,所以它在这里工作得很好。你能带来同样优雅​​的解决方案吗?

5 个答案:

答案 0 :(得分:4)

编辑我最初将“what”与“how”混为一谈。

你取得了什么?一个lazy initialization如何你取得了它?通过Factory pattern(正如许多其他人已经写过的那样)。

更新您可以使用标准Callable界面代替IWrapper

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

答案 1 :(得分:1)

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

  

工厂模式是一种创建设计模式,用于软件开发,以封装创建对象所涉及的过程。   对象的创建通常需要复杂的过程,这些过程不适合包含在合成对象中。

     

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

     

创建对象所需的一些过程包括确定要创建的对象,管理对象的生命周期,以及管理对象的专门构建和拆除问题。

答案 2 :(得分:1)

正如其他人之前所说,这被称为“Factory pattern”。在为自己搞清楚方面做得很好。

如果您想更进一步,请创建一个仅包含类名(String)的映射。这允许您从文件中读取名称,最后得到“Inversion of Control”,这会导致“Dependency Injection”。

答案 3 :(得分:0)

这听起来有点像object factory

答案 4 :(得分:0)

我记得很久以前写过关于工厂的CodeProject文章。你可以看看它:http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx

另外,不要过度。在http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12上有一篇关于工厂制品的优秀文章,可以让你了解如何在抽象事物上走得太远。