基础设计模式
一、单例模式
1.1单例模式的八种方式
1)饿汉式(静态常量)
2)饿汉式(静态代码块)
3)懒汉式(线程不安全)
4)懒汉式 (线程安全,同步方法)
5)懒汉式(线程安全,同步代码块)
6)双重检查
7)静态内部类
8)枚举
1.1.1 饿汉式(静态常量)
饿汉式的创建是这样的,先给一个私有的构造方法,目的是不能在其他类中创建该对象
在类初始化的时候就创建对象
提供对外调用的方法
public class Singledemo {
public static void main(String[] args) {
//获取实例
Singledemo singleInstance = Singledemo.getSingleInstance();
}
//提供私有的构造方法
private Singledemo() {
System.out.println("创建了一个单例实例");
}
//在类初始化的时候就创建对象
private static Singledemo singleInstance = new Singledemo();
//提供对外的调用方法
public static Singledemo getSingleInstance(){
return singleInstance;
}
}
总结:该方式比较简单,在类装载的时候就完成了实例化,避免了多线程同步问题
缺点: 在类装载的时候就实例化,如果一直没有用这个类的话,就造成了内存的浪费
1.1.2 饿汉式(静态代码块)
public class Singledemo2 {
//私有化构造方法
private Singledemo2(){
}
//定义私有的静态变量
private static Singledemo2 singledemo2;
//静态代码块中创建对象
static {
singledemo2=new Singledemo2();
}
//提供公有的方法获取实例
public Singledemo2 getSingledemo2(){
return singledemo2;
}
}
1.1.3懒汉式(线程不安全)
创建方式是这样的:
给一个私有的构造方法,使不能新建这个类
定义一个静态变量,先不创建对象
定义一个公有的方法,用来获取实例,在方法中判断实例是否为null,为null的时候new一个新的对象
public class SingleDemo3 {
public static void main(String[] args) {
SingleDemo3 singleDemo3 = SingleDemo3.getSingleDemo3();
}
//提供私有的静态方法
private SingleDemo3(){
System.out.println("等调用方法的时候,我创建了一个实例");
}
//提供静态变量
private static SingleDemo3 singleDemo3;
//提供共有的获取实例的方法
public static SingleDemo3 getSingleDemo3(){
if (singleDemo3==null){
singleDemo3=new SingleDemo3();
}
return singleDemo3;
}
}
优点:在使用的时候创建对象,避免了内存浪费的危险
缺点:这种创建方法线程不安全