这么长时间了,才来系统的学习一下设计模式,有点惭愧~
废话不多说,上翠花!
单例模式,顾名思义就是只有一个实例,就是类A只能new A()一次~
正常的,我们不考虑这种模式,一般会给一个类new出好多实例,这种情况会影响系统性能,没什么必要。
单例模式分为:饿汉模式,懒汉模式
1,饿汉模式
/**
* 饿汉模式很饿,一开始就给他喂饱
* 饿汉模式在类刚加载的时候就实例化
* 线程安全,因为都是新建的实例
*/
public class Singleton1 {
//静态变量
private static Singleton1 instance = new Singleton1();
//构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~
private Singleton1() {}
//拿实例的方法
public static Singleton1 getInstance(){
return instance;
}
}
2,懒汉模式
/**
* 懒汉模式就是很懒,所有每次人家跟他要东西才会给出东西,不提前干活
* 懒汉模式就是请求发出来,才开始加载,不会再类加载的时候加载
* 线程不安全,可能多个用户同时请求
*/
public class Singleton2 {
//静态变量
private static Singleton2 instance=null;
//构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~
private Singleton2() {}
public static Singleton2 getInstance(){
if(instance==null){
instance = new Singleton2();
}
return instance;
}
}
如果不是多线程,这个方法显然也够用了,但是万一是多线程呢?那么我们来优化!
public class Singleton2 {
//静态变量
private static Singleton2 instance=null;
//构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~
private Singleton2() {}
public static synchronized Singleton2 getInstance(){
if(instance==null){
instance = new Singleton2();
}
return instance;
}
}
这样就好了,可是要是这样,拿用户多了,访问多了,那效率多低啊!
再优化:
public class Singleton2 {
//静态变量
private static Singleton2 instance=null;
//构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~
private Singleton2() {}
public static synchronized Singleton2 getInstance(){
if(instance==null){ //1
synchronized(Singleton2.class){
instance = new Singleton2(); //2
}
}
return instance;
}
}
这样不是好了吗?深深的感觉不是~为啥?比如:当一个用户执行到代码2时,又来一个用户执行代码1,而此时第一个用户还没有实例化好,那就会报错啦!
唉,那咋办呢?自己选择吧!