首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

注册式单例类

2012-11-13 
登记式单例类登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。只是它的子

登记式单例类
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。只是它的子类实例化的方式只能是懒汉式的, 这是无法改变的。

java 代码

  1. import?java.util.HashMap;??
  2. ??
  3. public?class?RegSingleton??
  4. {??
  5. ????static?private?HashMap?m_registry?=?new?HashMap();??
  6. ????static??
  7. ????{??
  8. ????????RegSingleton?x?=?new?RegSingleton();??
  9. ????????m_registry.put(x.getClass().getName(),?x);??
  10. ????}??
  11. ??
  12. ????/**?
  13. ?????*?保护的默认构造子?
  14. ?????*/??
  15. ????protected?RegSingleton()??
  16. ????{??
  17. ????}??
  18. ??
  19. ????/**?
  20. ?????*?静态工厂方法,返还此类惟一的实例?
  21. ?????*/??
  22. ????static?public?RegSingleton?getInstance(String?name)??
  23. ????{??
  24. ????????if?(name?==?null)??
  25. ????????{??
  26. ????????????name?=?"com.javapatterns.singleton.demos.RegSingleton";??
  27. ????????}??
  28. ????????if?(m_registry.get(name)?==?null)??
  29. ????????{??
  30. ????????????try??
  31. ????????????{??
  32. ????????????????m_registry.put(name,?Class.forName(name).newInstance());??
  33. ????????????}??
  34. ????????????catch?(Exception?e)??
  35. ????????????{??
  36. ????????????????System.out.println("Error?happened.");??
  37. ????????????}??
  38. ????????}??
  39. ????????return?(RegSingleton)?(m_registry.get(name));??
  40. ????}??
  41. ??
  42. }??


它的子类RegSingletonChild 需要父类的帮助才能实例化。

java 代码
  1. public?class?RegSingletonChild?extends?RegSingleton??
  2. {??
  3. ????public?RegSingletonChild()??
  4. ????{??
  5. ????}??
  6. ??
  7. ????/**?
  8. ?????*?静态工厂方法?
  9. ?????*/??
  10. ????static?public?RegSingletonChild?getInstance()??
  11. ????{??
  12. ????????return?(RegSingletonChild)?RegSingleton.getInstance("com.javapatterns.singleton.demos.RegSingletonChild");??
  13. ????}??
  14. ??
  15. }??

在GoF 原始的例子中,并没有getInstance() 方法,这样得到子类必须调用的getInstance(String name)方法并传入子类的名字,因此很不方便。此处在登记式单例类子类的例子里,加入了getInstance() 方法,这样做的好处是RegSingletonChild 可以通过这个方法,返还自已的实例。而这样做的缺点是,由于数据类型不同,无法在RegSingleton 提供这样一个方法。由于子类必须允许父类以构造子调用产生实例,因此,它的构造方法必须是公开的。这样一来,就等于允许了以这样方式产生实例而不在父类的登 记中。这是登记式单例类的一个缺点。

GoF 曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。这是登记式单例类的另一个缺点。

热点排行