单例模式
程序员文章站
2022-03-20 21:45:46
一、什么是单例 1、私有的静态全局变量,变量类型就是该类的类型。 2、构造方法私有化(避免使用new去创建对象) 3、对外提供公有的静态方法,用于获取该类对象。 二、单例解决什么问题 确保类对象的唯一性(即该类只能有一个对象) 三、单例的种类和代码实现 饥汉模式 测试单例模式 1 public cl ......
一、什么是单例
1、私有的静态全局变量,变量类型就是该类的类型。
2、构造方法私有化(避免使用new去创建对象)
3、对外提供公有的静态方法,用于获取该类对象。
二、单例解决什么问题
确保类对象的唯一性(即该类只能有一个对象)
三、单例的种类和代码实现
饥汉模式
1 public class Singleton { 2 3 private static Singleton instance = null; //静态全局变量 4 5 /** 6 私有的构造方法 7 @param 无 8 */ 9 private Singleton(){ 10 11 } 12 13 //静态初始化块 14 static{ 15 instance= new Singleton(); 16 } 17 18 /** 19 静态方法getInstance() 20 @param 无 21 */ 22 public static Singleton getInstance(){ 23 //饱汉模式 24 /*if(instance == null){ 25 instance= new Singleton(); 26 }*/ 27 return instance; 28 } 29 }
测试单例模式
1 public class SingletonTest { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 //不能通过new来创建对象,因为构造方法私有 9 //Student s3= new Student(); 10 //调用Student类的静态方法获取对象的地址 11 Singleton s1= Singleton.getInstance(); 12 Singleton s2= Singleton.getInstance(); 13 /* 14 比较两个变量的值是否相等如果相等,则表明只创建了一个对象, 15 两个变量都共有该对象的地址 16 */ 17 System.out.println(s1 == s2); 18 } 19 20 }View Code
升级版
1 public class Singleton1 { 2 3 private static final class SingletonHolder{ 4 private static final Singleton1 INSTANCE = new Singleton1(); 5 } 6 7 private Singleton1(){ 8 9 } 10 11 public static Singleton1 getInstance(){ 12 return SingletonHolder.INSTANCE; 13 } 14 }
反序列化版
1 public class Singleton2 implements Serializable{ 2 3 //防止创建多个对象 4 private static final class SingletonHolder{ 5 private static final Singleton2 INSTANCE = new Singleton2(); 6 } 7 8 private Singleton2(){ 9 10 } 11 12 public static Singleton2 getInstance(){ 13 return SingletonHolder.INSTANCE; 14 } 15 16 //反序列化 17 private Object readResolve(){ 18 return SingletonHolder.INSTANCE; 19 } 20 } 21 22 //枚举实现单例 23 /* 24 public enumSingleton{ 25 INSTANCE; 26 public File openFile(String fileName){ 27 return getFile(fileName); 28 } 29 }*/
饱汉模式
1 public class Singleton3 { 2 3 private static volatile Singleton3 singleton3; 4 5 private Singleton3(){ 6 7 } 8 9 public static Singleton3 getInstance(){ 10 if(null == singleton3){ 11 synchronized (Singleton3.class) { 12 if(null == singleton3){ 13 singleton3 = new Singleton3(); 14 } 15 } 16 } 17 return singleton3; 18 } 19 20 }
上一篇: 简单的全排列问题(给初学者)