您的位置:首页 > 其它

(设计模式)Singleton和Double-Checked Locking模式

2007-01-20 01:02 393 查看
h1,h2,h3,h4,h5 { font-family:Verdana, Arial; color:#112233; margin:10px 0px; }
p { margin:5px 0px; padding:0px; font-family:Verdana, Arial; font-size:12px;
color:#334455; }
p.pre { line-height:25px; text-indent:24px; }
ul { list-style-position:outside; margin:0px; padding:0px; }
li { list-style-type:square; margin-left:24px; font-size:12px; line-height:20px; }

模式摘要

PS:紫色和蓝色的字为原书的话

《设计模式解析》一书中提到的建筑师Christopher Alexander对模式的定义:“在某一背景下某个问题的一种解决方案!”。它说,一个模式的描述应该包括:

模式的名称

模式的目的,即要解决的问题

实现方法

为了实现该模式我们必须考虑的限制和约束因素

Singleton模式和Double-Checked Locking模式

模式的名称:Singleton & Double-Checked Locking
模式的目的:保证一个类仅有一个实例,并提供一下访问它的全局访问点。即,希望对象只有一个实例,但没有控制对象实例化的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。
实现:

添加一个类的私有的静态成员变量,引用所需的对象(初值为null)。

添加一个公共的静态方法,它在成员变量的值为null时实例化这个类(并设置成员变量的值),然后返回该成员变量的值。

将构造方法的状态设置为保护或私有,从而访止任何人直接实例化这个类,绕过静态构造方法机制。

代码示例:项目中,如果有一个系统的工厂类,或者是数据库工厂类,通常这个工厂模式中会用到单件模式(Singleton)
代码一(JAVA - Singleton):单线程




public class SimpleFactory ...{


private static SimpleFactory factory = null;




private SimpleFactory() ...{


}




public static SimpleFactory getInstance() ...{


if(factory == null)


factory = new SimpleFactory();


return factory;


}


}

代码二(JAVA - Singleton):多线程1(设计模式解析中推荐)




public class SimpleFactory ...{






private SimpleFactory() ...{


}






public static SimpleFactory getInstance() ...{


return Factory.factory;


}






/** *//**


* 用类来装载SimpleFactory的唯一的实例


*/




private static class Factory ...{


static final SimpleFactory factory = new SimpleFactory();


}


}

代码三(JAVA - Double-Checked Locking):多线程2




public class SimpleFactory ...{


private static SimpleFactory factory = null;




private SimpleFactory() ...{


}




public static SimpleFactory getInstance() ...{




if (factory == null) ...{




synchronized(this) ...{




if (factory == null) ...{


factory = new SimpleFactory();


}


}


}


return factory;


}


}

调用都是一致的




public static void main(String[] args) ...{


SimpleFactory factory = SimpleFactory.getInstance();


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: