黑马程序员技术交流社区
标题: 第二贴之单例设计模式(Singleton) [打印本页]
作者: 黄茂霖 时间: 2013-4-26 19:47
标题: 第二贴之单例设计模式(Singleton)
本帖最后由 shenqi 于 2013-4-27 00:07 编辑
第二贴之单例设计模式(Singleton)
单例(Singleton)其实就是唯一实例的意思,也就是说一个类只有一个唯一的实例。在Java里,只要new一个类,就会创建这个类的一个实例,如果把这个类new多次,就会创建这个类的多次实例。有时候如果要程序运行时,不管new多少次,只需创建这个类的一个实例,这时候就用到单例。这就好比在足球场上,双方队员都在围绕着一个足球进行运动,时刻保持足球场上只有一个足球,试想一下如果足球场上有多个足球,球员岂不是乱套了不知该踢哪个球?
单例是一种设计模式,是23种设计模式之一,也是当中最简单最重要的一个设计模式了。单例分为饿汉式(饱汉式)和懒汉式(饥汉式)。
饿汉式(饱汉式):类加载时就创建好实例,等待别人调用。简单来说就是一开始就饿然后马上就吃饱了。张孝祥老师高新技术里称 饱汉式 和 饥汉式,这里区分一下就是。
示例代码:
- Class Singleton{
- //为了防止让别人创建多个实例,首先把修饰符的权限变成最小的
- private Singleton (){}
- //一上来就创建实例
- private static Singleton instance = new Singleton ();
- //给外界提供一个唯一的实例的返回值
- public static Singleton getInstance (){
- return instance;
- }
- }
复制代码 懒汉式(饥汉式):类加载时不创建,等待别人调用时再创建实例。简单来说就是一开始不吃,等到饿的时候再吃。
示例代码:
- Class Singleton{
- //同上
- private Singleton(){}
- //一开始定义好
- private Singleton instance = null;
- //调用时再创建实例返回
- public static Singleton getInstance(){
- if(instance == null)
- instance = new Singleton();
- return instance;
- }
- }
复制代码 注意:在多线程编程中 懒汉式 存在线程安全问题,会导致可能存在1个以上的实例,所以必须用双检测机制,把以上代码修改成:
Class Singleton{
privateSingleton(){}
privateSingleton instance = null;
//在此处添加synchronized
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance ==null){
instance =new Singleton();
}
}
}
除此之外还可以使用JDK5.0的新特性枚举(enumeration)来设计单例模式:
示例代码:- Class Singleton{
- private Singleton(){}
- private Singleton instance = null;
- //在此处添加synchronized
- public static Singleton getInstance(){
- if(instance == null){
- synchronized (Singleton.class){
- if(instance == null){
- instance = new Singleton();
- }
- }
- }
复制代码 关于枚举的知识,大家可以参考张孝祥老师的视频--高新技术①:
http://edu.csdn.net/news/2012823/6a28cc67ab0f.shtml
总结:
1. 在开发中通常使用的是饿汉式来设计单例模式,因为不存在线程安全问题。
2. 如果需要写多个单例,可以适当考虑使用enum枚举来设计,这样代码更加简洁。
3. 懒汉式 通常是面试官面试程序员用的,所以注意一下就可以。
作者: 曹睿翔 时间: 2013-4-26 20:25
兄弟哪里人啊,一会饿一会饥的(修改下吧,按毕老师的叫法),我们老家才说饥的,
还有就是懒汉式的安全问题,双重判断,能稍微提高效率,代码也需要修改下
建议查一下单例在各方面的应用,搜一下,再总结,用自己的话串起来,开始的足球比喻就不错
这样会不会让你掌握更扎实呢,是的话继续加油!
作者: 黄茂霖 时间: 2013-4-26 23:55
曹睿翔 发表于 2013-4-26 20:25
兄弟哪里人啊,一会饿一会饥的(修改下吧,按毕老师的叫法),我们老家才说饥的,
还有就是懒汉式的安全问 ...
张孝祥老师叫做饥汉,一开始我也蒙了 ,后来他解释才缓过来- -!~长下见解而已 嘻嘻!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |