概述
前言:今天去面试了一家公司,老板人挺好的。很多事亲力亲为,而且办事效率很高。也总结了一下上一份工作所学到的和自己的状态,在上一份工作中我也学到了很多很多,接触了很多的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以上版本才能正常使用
好了,单例模式我们就已经学习完了,其实单例模式看起来很简单,其实记住我最开始说的那句话就好了,但在实际开发中,单例模式的出现率还是很高的。
最后替单例模式打一句广告,单例模式值得你拥有!
最后
以上就是飞快诺言为你收集整理的设计模式——单例模式(创建型模式)的全部内容,希望文章能够帮你解决设计模式——单例模式(创建型模式)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复