设计模式——单例模式
来源:互联网 发布:赵薇杀人知乎 编辑:程序博客网 时间:2024/05/18 15:26
在项目开发过程中,如果我们当且仅当,只需要实例化一个对象,我们就需要使用单例模式。就像在足球场中,双方队员都在踢一个球,没有说,上来踢好几个球的,是吧。单例模式和这个差不多,只实例化一个对象。这个单例模式的应用时很广泛的,想在cocos2dx 中,导演类,SpriteFrameCache等类都是用了单例模式。日志类,线程池等技术里面都是用了,单例设计模式。
单例模式虽然简单,但是要很好的使用并且掌握它,还是要下功夫的。单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
首先,单例模式的原理图:
单例模式有好几种写法,主要包括懒汉式,饿汉式以及登记单例模式。在java中,单例模式和反射机制还有一定的联系,但是在这篇博客中,我们不涉及这一部分。
1.懒汉式单例:
public class test{
Private static test instance=null;
Public static test getInstance(){
If(instance==null){
Instance=new test();
}
Return instance;
}
}
单例模式,就是将一个实例变量设置为私有的,只能这个类本身来实例化它,然后通过一个公共的get方法,来获得这个实例,并向整个程序提供这个实例。
但是,可以看出,这中单例方法不是线程安全的。下面有几种改进方法,是的这个懒汉式单例模式变的线程安全的。这几中方法各有利弊,最后,我们会有一个总结。
1.1 在get方法中加关键字
public class test{
Private static test instance=null;
Public static synchronized test getInstance(){
If(instance==null){
Instance=new test();
}
Return instance;
}
}
1.2 双检索
public class test{
Private static test instance=null;
Public static est getInstance(){
If(instance==null){
synchronized (this){
I nstance=new test();
}
}
Return instance;
}
}
2.饿汉式单例:这个的优点主要时线程安全。
Public class test{
Private test();
Private static final test instance=new test();
Public static test getInstance(){
Return instance;
}
}
饿汉模式和懒汉模式的主要区别就在于,饿汉模式天生线程安全,懒汉模式就不是线程安全的。并且,懒汉模式的线程安全的方法,还是有区别的:
第一种是直接在方法上加上同步,这样虽然可以,但是每一次都要同步,这样会影响性能,尤其是在高并发下。
第二种,在getinstance两次判断是否为null,只有在第一次实例化的时候才加同步,之后就不会做同步了,即保证线程安全,有大大改进了第一种方法的弊端。
设计模式虽然好,但是不要生搬硬套,要理解每一个设计模式背后的用意,这才是我们学习设计模式的关键。
- 设计模式—单例设计模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 以socket连接方式向memcached存储数据
- Hdu 2795
- 出现乱码的原因及改正
- Hadoop2.2配置详解
- V-Play 文档翻译 ListPage
- 设计模式——单例模式
- 深入研究java.lang.ThreadLocal类
- 紫书 p120 第五章例题5-7 丑数
- 深入理解Android之AOP
- Leetcode: 232. Implement Queue using Stacks(JAVA)
- 机器学习中的相似性度量
- 不谈程序,谈发展,推荐一些励志书,也许可以改变你的困境
- traits编程技法感悟
- 《leetCode》:Insertion Sort List