闲的无聊,来写写Java设计模式,这次先写最简单的 单利模式,单利模式可能是很多程序员接触的第一个设计模式。因为单利模式谁也不知道到到底有多种写法,各有各的不同,在此我介绍我所知道的几种单利模式。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例
饿汉模式
//懒汉,线程安全
public class Demo1 {
private static Demo1 demo =new Demo1();
public static Demo1 getDemo1(){
return demo;
};
private Demo1(){}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
懒汉模式
发现这两种方式的区别了吗?懒汉式也是通过一个类的静态变量实现的。但是并没有直接初始化。而是在函数getDemo2()中实例化的,也就是每次想用这个实例的时候初始化的,如果已经初始化了,那么就不用初始化了,这样也很好啊,对的,其实懒汉式是比较常用的实现方式。
//懒汉,安全(双重锁)
public class Demo2 {
private Demo2 demo2=null;
public Demo2 getDemo2(){
if(demo2==null){
synchronized(Demo2.class){
if(demo2==null){
demo2=new Demo2();
}
}
}
return demo2;
}
private Demo2(){}
}
枚举模式
//枚举 安全(推荐)
public enum Demo3 {
INSTANCE;
public void whateverMethod() {
}
}
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
静态内部类
//静态内部类 安全
public class Demo4 {
private static class getInstance{
private static Demo4 instance=new Demo4();
}
public static Demo4 getDemo4(){
return getInstance.instance;
}
private Demo4(){}
}
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程.