您的位置:首页 > 编程语言 > Java开发

[置顶] 简述Java设计模式之单例模式(Singleton)

2016-09-21 09:34 351 查看
首先我们了解下什么是单例模式:单例模式就是保证了某个类只有一个实例,而且自行实例这个类并向整个系统提供这个实例,什么时候我们需要设计成单例模式呢,比如一些大的类,反复用到的类:ImageLoder ,Volley等等。下面我用简单代码来展示一下单例模式的两种形式(饿汉式和懒汉式),这里我就不做过多的讲解了,我在代码中都有详细的注释。

/*
这是懒汉式基本写法
它只声明对象,不创建对象,只有别人调用我这个方法的时候才创建
这个有一个问题,就是在多线程并发的时候,它可能会多次创建这个类的对象,这就违背了单例模式的原则
多线程并发的时候,无法判断是否为空,有可能两个一起走到这里同时创建了对象

*/
public class Singletons2  {
//    1写法
//    private  static  Singletons2 sin2;
//    private  Singletons2() {
//    }
//    public  static  Singletons2 getSin2(){
//        if (sin2==null){
//            sin2=new Singletons2();
//        }
//        return  sin2;
//    }

/*
这种写法避免了1写法的多次创建对象,给这个公共方法加了一个synchronized同步锁
避免了多线程并发的时候创建多个对象,线程需要排队了,这是时候后进来的线程就可以做判断了
这样的话就只能创建一个对象了
但是,在多次调用我这个类的时候比较耗费时间,因为同步锁里面的一些逻辑比较耗费时间。
*/
// 2写法
//    private static  Singletons2 sin2;
//    private  Singletons2(){
//    }
//    public  static  synchronized   Singletons2 getSin2(){
//        if (sin2==null){
//            sin2=new Singletons2();
//        }
//        return  sin2;
//    }

/*
1和2写法的话都有一些问题,我们需要做一些处理让多线程并发的时候在这个声明类对象的时候加一个
volatile,这样的话就可以快速创建这个类,也保护了同步安全,然后我们在公共方法中做双重判断
首先判断为空的话进来,避免多线程并发多次创建对象,判断里面加一个同步锁,这样就要排队了
同步锁里在判断一次,这样的话只需创建一次对象,同步锁也只用一次,这样的话就比较节省时间了,同时也遵守了单例模式的原则
*/

//3写法
private static  volatile Singletons2 sin2;
private  Singletons2(){
}
public  static   Singletons2 getSin2() {
if (sin2 == null) {
synchronized (Singletons2.class) {
if (sin2 == null) {
sin2 = new Singletons2();
}
}
}
return sin2;
}

}

下面是另一种方式叫饿汉式也叫激进式

/*
这是饿汉式单例模式,也叫激进式
先把对象创建出来,不管别人有没有在调用
还要创建一个以类为返回值的方法,这个方法是公共的,让别人来调用我这个对象
把这个类的构造方法私有化,只允许本类创建本类的对象
*/
public class Singletons {
private static Singletons singletons=new Singletons();
private Singletons(){
}
public static Singletons getsing(){
return singletons;
}
}


这样的话我们就完成了单例模式的两种方式,后面还会陆续根据自己的理解写一下工厂模式的三种方式,希望可以和大家一起交流学习~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: