2008-03-02
java设计模式之单例模式
1.定义
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。
2.使用场合
简而言之,就是任何只需要一个实例的地方.例如,窗口管理器,假脱机打印设备,数据库连接池。具体应用中,配置信息类,管理类,控制类,门面类,代理类通常被设计为单例类.
(1)配置信息类
负责配置文件的解析,通常被设计为单例类
(2)管理类
如连接池管理类,通常被设计为单例类
(3)控制类,
如struts的ActionServlet类,也是单例类。
如下,只需在web.xml配置以下ActionServlet,tomcat容器自动装载后,即可完成对整个web系统提供ActionServlet实例。
(4)门面类
说到门面类,就不能不提门面(Facade)模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。但这不是绝对的。
(5)代理类
在Jive中,使用代理模式实现权限访问的入口,就采用了单例模式。
3.单例模式在Java语言的实现
单例模式在Java语言的实现上有三种情况:饿汉式单例类,懒汉式单例类,登记式单例类。
(1)饿汉式单例类
饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时,就会将自己实例化。
(2)懒汉式单例类
与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。
(3)登记式单例类
登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。
登记式单例类的子类
单例模式是对象的创建模式的一种,它保证一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。
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.";
}
}
评论
毛毛虫
2008-04-05
前面那个两个见过,后面那个么有见过...
就那么一个对象为什么还要放在hashMap里面呢?
就那么一个对象为什么还要放在hashMap里面呢?
senbao18
2008-03-30
单例模式适合于没有状态改变的类,巧妙的避免了多实例的产生!
xuehongliang
2008-03-03
写的不错,通过几个小例子对单例模式进行介绍,简单易懂。
yyjn12
2008-03-03
好象一般说 "双重检查锁" 比较好.
我想知道1)饿汉式单例类 有什么缺点呢.
我想知道1)饿汉式单例类 有什么缺点呢.
bigelf
2008-03-03
“(2)懒汉式单例类” 写的有问题
BEA
2008-03-03
我在面试中被人考过
还好有人提醒
我把代码都记住了
有些有用的,特别是在特殊的场合下还是要记一下代码的,虽然不好.
复习了一次
谢谢
还好有人提醒
我把代码都记住了
有些有用的,特别是在特殊的场合下还是要记一下代码的,虽然不好.
复习了一次
谢谢
coder1982
2008-03-03
单例是最常见最经典的JAVA设计模式
mfcai
2008-03-02
谢谢网友寄生虫的提醒。欢迎常来
寄生虫
2008-03-02
希望对自己的代码加以标示,javaeye有代码块的功能啊,标注上之后估计不会这么快投你隐藏了,别人看着都累
- 浏览: 5768 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
sqlserver锁机制研究
写的相当明了, 要是多添加些实例说明就好了。
-- by liuchen_good -
小议基于j2ee框架下的ioc ...
真的是,失望啊,我最近到学习IOC的实现,你可把我们给骗拉。
-- by tantec -
小议基于j2ee框架下的ioc ...
像是spring的user guide
-- by ladofwind -
小议基于j2ee框架下的ioc ...
引用这个不叫实现,叫配置,谢谢 谢谢你的指正.
-- by mfcai -
小议基于j2ee框架下的ioc ...
这个不叫实现,叫配置,谢谢
-- by Clayz






评论排行榜