设计模式——单例模式

来源:互联网 发布:赵薇杀人知乎 编辑:程序博客网 时间: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,只有在第一次实例化的时候才加同步,之后就不会做同步了,即保证线程安全,有大大改进了第一种方法的弊端。


设计模式虽然好,但是不要生搬硬套,要理解每一个设计模式背后的用意,这才是我们学习设计模式的关键。

0 0
原创粉丝点击