设计模式——单例模式(创建型模式)

来源:互联网 发布:以下哪件商品淘宝禁售 编辑:程序博客网 时间:2024/06/05 08:15
前言:今天去面试了一家公司,老板人挺好的。很多事亲力亲为,而且办事效率很高。也总结了一下上一份工作所学到的和自己的状态,在上一份工作中我也学到了很多很多,接触了很多的Android开发技术,感谢上一份工作为我带来的锻炼。我也要赶紧在最近把设计模式的学习笔记整理完毕,方便在下一份工作中能够提高自己的代码质量。
大丈夫当雄飞,安能雌伏?——《后汉书》

单例模式:确保一个类只有一个实例,并提供一个全局访问点。

注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。
注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。
注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。

重要的事情要说三遍,记住这句话,其实就会写单例模式了。
今天我就不以故事和情节引入了,因为单例模式实在太简单了,如果设计这些情节反而弄巧成拙不易于理解。
package com.example.vicky.singletonpattern.SingletonPattern;/** * Created by Vicky on 2016/10/25. */public class SingleClass {    //私有的静态变量    private static SingleClass singleClass;    //私有的构造方法    private SingleClass(){    }    //一个公共的静态方法    public static SingleClass getSingleClass(){        if (singleClass==null){            singleClass=new SingleClass();        }        return singleClass;    }}
其实很容易理解,只要记住了我前面说的一句话,那也就记住了怎么去写一个单例模式。
在实例化对象的时候,由于我们把构造方法声明成了私有的,所以我们并不能通过new的方式去获取这个对象,而只能通过我们暴露的getSingleClass()方法去获取到对象。
在getSingleClass()方法中,我们通过判断singleClass对象是否为null,如果为null那么我们就进行实例化,然后返回这个对象。如果不为null,那我们就直接返回这个对象,这样也就保证了我们全局只有一个实例。
在我们需要实例化的时候,我们直接调用暴露的方法就可以了。
SingleClass singleClass=SingleClass.getSingleClass();
这样。一个简单的单例模式就完成了。

让我们再深入一点:
多线程的问题
我们知道我们的程序大多都是多线程的,但如果通过以上的简单的单例模式我们会遇到多线程带来的问题,当singleClass对象还没被创建时,线程1和线程2同时调用getSingleClass方法时,我们会发现,这时候会创建了两个Me的对象,造成单例模式的失效。
所以处理多线程,我们可以通过以下3种常用的方法进行改善我们的单例模式:
1、通过同步锁,添加synchronized确保同时只有一个线程执行getSingleClass方法:
public class SingleClass {    //私有的静态变量    private static SingleClass singleClass;    //私有的构造方法    private SingleClass(){    }    //一个公共的静态方法    public static synchronized SingleClass getSingleClass(){        if (singleClass==null){            singleClass=new SingleClass();        }        return singleClass;    }}

优点:此方法的优点是简单,如果对性能要求不高的话,可以采用此方法
缺点:同步的方法造成程序执行效率下降

2、使用“急切”创建实例,而不用延时实例化的做法
package com.example.vicky.singletonpattern.SingletonPattern;/** * Created by Vicky on 2016/10/25. */public class SingleClass {    //私有的静态变量    private static SingleClass singleClass=new SingleClass();    //私有的构造方法    private SingleClass(){    }    //一个公共的静态方法    public static SingleClass getSingleClass(){        return singleClass;    }}
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
这也是我们日常中使用频率比较高的方式。

3、双重检查加锁,在getSingleClass中减少使用同步
package com.example.vicky.singletonpattern.SingletonPattern;/** * Created by Vicky on 2016/10/25. */public class SingleClass {    //私有的静态变量    private static volatile SingleClass singleClass;    //私有的构造方法    private SingleClass(){    }    //一个公共的静态方法    public static SingleClass getSingleClass(){        if (singleClass==null){            synchronized (SingleClass.class){                if (singleClass==null){                    singleClass=new SingleClass();                }            }        }        return singleClass;    }}
优点:性能最优,不仅解决多线程问题,而且不影响性能
确定:Java5以上版本才能正常使用

好了,单例模式我们就已经学习完了,其实单例模式看起来很简单,其实记住我最开始说的那句话就好了,但在实际开发中,单例模式的出现率还是很高的。

最后替单例模式打一句广告,单例模式值得你拥有!

0 0
原创粉丝点击