浏览 2808 次
锁定老帖子 主题:java设计模式之单例模式
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-02
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。 2.使用场合 简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类. (1)配置信息类 负责配置文件的解析,通常被设计为单例类 (2)管理类 如连接池管理类,通常被设计为单例类 (3)控制类, 如struts的ActionServlet类,也是单例类。 如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。 <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> (4)门面类 说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。 (5)代理类 在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。 3.单例模式在Java语言的实现 单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。 (1)饿汉式单例类 饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。 public class Singleton2{ //注意这是private private static Singleton2 theInstance = new Singleton2(); //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton2 getInstance(){ return theInstance; } } (2)懒汉式单例类 与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。 public class Singleton { public static Singleton theInstance = null; private Singleton(){} public synchronized static Singleton instance(){ if(theInstance == null){ return new Singleton(); } return theInstance; } } (3)登记式单例类 登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。 public class RegSingleton { static private HashMap m_registry = new HashMap(); static { RegSingleton x = new RegSingleton(); m_registry.put(x.getClass().getName(), x); } protected RegSingleton(){ } static public RegSingleton getInstance(String name) { if (name == null) { name = "com.javapatterns.singleton.demos.RegSingleton"; } if (m_registry.get(name) == null) { try { m_registry.put(name, Class.forName(name).newInstance()); } catch (Exception e) { System.out.println("Error happened."); } } return (RegSingleton) (m_registry.get(name)); } } 登记式单例类的子类 import java.util.HashMap; public class RegSingletonChild extends RegSingleton { public RegSingletonChild() {} static public RegSingletonChild getInstance() { return (RegSingletonChild) RegSingleton.getInstance( "com.javapatterns.singleton.demos.RegSingletonChild" ); } public String about() { return "Hello, I am RegSingletonChild."; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-02
希望对自己的代码加以标示,javaeye有代码块的功能啊,标注上之后估计不会这么快投你隐藏了,别人看着都累
|
|
返回顶楼 | |
发表时间:2008-03-02
谢谢网友寄生虫的提醒。欢迎常来
|
|
返回顶楼 | |
发表时间:2008-03-03
单例是最常见最经典的JAVA设计模式
|
|
返回顶楼 | |
发表时间:2008-03-03
我在面试中被人考过
还好有人提醒 我把代码都记住了 有些有用的,特别是在特殊的场合下还是要记一下代码的,虽然不好. 复习了一次 谢谢 |
|
返回顶楼 | |
发表时间:2008-03-03
“(2)懒汉式单例类” 写的有问题
|
|
返回顶楼 | |
发表时间:2008-03-03
好象一般说 "双重检查锁" 比较好.
我想知道1)饿汉式单例类 有什么缺点呢. |
|
返回顶楼 | |
发表时间:2008-03-03
写的不错,通过几个小例子对单例模式进行介绍,简单易懂。
|
|
返回顶楼 | |
发表时间:2008-03-30
单例模式适合于没有状态改变的类,巧妙的避免了多实例的产生!
|
|
返回顶楼 | |
发表时间:2008-04-05
前面那个两个见过,后面那个么有见过...
就那么一个对象为什么还要放在hashMap里面呢? |
|
返回顶楼 | |