基础设计模式
一、单例模式
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; } }
优点:在使用的时候创建对象,避免了内存浪费的危险
缺点:这种创建方法线程不安全