单列模式
一、单列模式有:懒汉模式、饿汉模式、双重锁模式
1、懒汉模式:在第一次请求的时候才创建实例,并且第一次创建后就不能再创建该实例
2、饿汉模式:在类加载的时候就创建实例
3、双重锁模式:双重锁模式其实就是懒汉模式的双重锁模式,也是三种模式中效率最高的模式
二、创建单列模式的步骤:
1、创建一个私有的静态变量
2、创建一个私有的构造方法
3、创建一个公有的静态方法,并返回实例
三、代码示例
1、懒汉模式
1 package com.singleton; 2 /** 3 * 单列模式,懒汉模式,在第一次请求的时候创建实例,并且第一次创建实例后就不能在创建该实例 4 * @author Administrator 5 * 6 */ 7 public class Singleton1 { 8 //创建一个私有的静态变量 9 private static Singleton1 singleton1 = null; 10 //创建一个私有的构造方法 11 private Singleton1(){ 12 13 } 14 //创建一个共有的静态方法,并返回该实例 15 public static Singleton1 getSingleton(){ 16 if(singleton1 == null){ 17 singleton1 = new Singleton1(); 18 System.out.println("创建一个Singleton实例"); 19 }else{ 20 System.out.println("已经创建Singletong实例了,不能再创建"); 21 } 22 return singleton1; 23 } 24 //测试 25 public static void main(String[] args) { 26 //测试懒汉模式 27 Singleton1 s = Singleton1.getSingleton(); 28 System.out.println("第一次--->" + s); 29 System.out.println("第二次--->" + Singleton1.getSingleton()); 30 System.out.println("第三次--->" + Singleton1.getSingleton()); 31 } 32 }
2、饿汉模式
1 package com.singleton; 2 /** 3 * 单列模式,饿汉模式,类加载的时候就创建实例 4 * @author Administrator 5 * 6 */ 7 public class Singleton2 { 8 //创建私有的静态变量,并创建实例 9 private static Singleton2 singleton2 =new Singleton2(); 10 //创建私有的构造方法 11 private Singleton2(){ 12 System.out.println("构造函数执行了"); 13 } 14 //创建一个共有的静态方法,并返回实例 15 public static Singleton2 getSingleton2(){ 16 return singleton2; 17 } 18 19 //测试饿汉模式 20 public static void main(String[] args) { 21 Singleton2 s2 = Singleton2.getSingleton2(); 22 System.out.println(s2); 23 System.out.println(Singleton2.getSingleton2()); 24 System.out.println(Singleton2.getSingleton2()); 25 } 26 }
2、双重锁模式
1 package com.singleton; 2 /** 3 * 单列模式,双重锁模式 4 * @author Administrator 5 * 6 */ 7 public class Singleton3 { 8 //创建一个私有的静态变量 9 private static Singleton3 singleton3 = null; 10 //创建一个私有的构造方法 11 private Singleton3(){ 12 System.out.println("构造函数开始!"); 13 } 14 //创建一个公有的静态方法,并返回实例 15 public static synchronized Singleton3 getSingleton3(){ 16 if(singleton3 == null){ 17 synchronized (Singleton3.class) { 18 if(singleton3 == null){ 19 singleton3 = new Singleton3(); 20 } 21 } 22 } 23 return singleton3; 24 } 25 26 //测试双重锁模式 27 public static void main(String[] args) { 28 Singleton3 s3 = Singleton3.getSingleton3(); 29 System.out.println(s3); 30 System.out.println(Singleton3.getSingleton3()); 31 System.out.println(Singleton3.getSingleton3()); 32 } 33 }