-
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
-
适用性
1)当只需要创建一个对象时。
-
举例
例如世上只有一个中国,只能创建一个中国对象。
例如只有一个北京,对象也只能创建一个。 -
UML类图
-
代码示例
- 单例模式-饿汉模式
package com.jin.demo.DesignPatterns.Singleton; /** * 单例模式-饿汉模式 * @auther jinsx * @date 2019-05-17 16:56 */ public class SingletonA { // 类加载时创建对象 private static final SingletonA A = new SingletonA(); // 私有构造器 private SingletonA() { } // 对外提供实例对象方法 public static SingletonA getInstance(){ return A; } }
- 单例模式-懒汉模式
package com.jin.demo.DesignPatterns.Singleton; /** * 单例模式-懒汉模式 * @auther jinsx * @date 2019-05-17 16:56 */ public class SingletonB { // 类加载时创建对象 private static SingletonB B = null; // 私有构造器 private SingletonB() { } // 对外提供实例对象方法 public static SingletonB getInstance(){ if (B == null){ synchronized (SingletonB.class){ if (B == null){ B = new SingletonB(); } } } return B; } }
- 单例模式-枚举模式,支持序列化和反序列化前后为同一个对象,验证方法同SingletonC类(TestSingleton.testC())
package com.jin.demo.DesignPatterns.Singleton; /** * 单例模式-枚举模式,支持序列化和反序列化前后为同一个对象,验证方法同SingletonC类(TestSingleton.testC()) * @auther jinsx * @date 2019-05-17 16:56 */ public enum SingletonEnum { INSTANCE; Object obj; SingletonEnum(){ obj = new Object(); } public Object getInstance(){ return obj; } }
- 单例模式-实现Serializable接口,增加readResolve()方法,保证同一个对象
package com.jin.demo.DesignPatterns.Singleton; import java.io.Serializable; /** * 单例模式-实现Serializable接口,增加readResolve()方法,保证同一个对象 * @auther jinsx * @date 2019-05-17 17:24 */ public class SingletonC implements Serializable { // 类加载时创建对象 private static final SingletonC C = new SingletonC(); // 私有构造器 private SingletonC() { } // 对外提供实例对象方法 public static SingletonC getInstance(){ return C; } // 增加此方法,保证对象反序列化后还是同一个对象 public Object readResolve(){ return C; } }
- 测试类
package com.jin.demo.DesignPatterns.Singleton; import java.io.*; /** * 测试类 * @auther jinsx * @date 2019-05-17 11:02 */ public class TestSingleton { public static void main(String[] args) { testABE(); testC(); } // 验证(SingletonA/SingletonB/SingletonEnum)是单例 public static void testABE() { System.out.println(SingletonA.getInstance() == SingletonA.getInstance());//true System.out.println(SingletonB.getInstance() == SingletonB.getInstance());//true System.out.println(SingletonEnum.INSTANCE.getInstance() == SingletonEnum.INSTANCE.getInstance());//true } // 验证(SingletonC)序列化 public static void testC(){ File file = new File("SingletonC"); ObjectOutputStream oos = null; ObjectInputStream ois = null; try { // 序列化 oos = new ObjectOutputStream(new FileOutputStream(file)); SingletonC C = SingletonC.getInstance(); //原对象 oos.writeObject(C); oos.close(); // 反序列化 ois = new ObjectInputStream(new FileInputStream(file)); SingletonC C2 = (SingletonC) ois.readObject(); // 验证同一个对象 System.out.println(C == C2);//true } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (oos != null) { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } if (ois != null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- 执行测试结果
true true true true
- 单例模式-饿汉模式
-
点击Java之23种设计模式查看更多的设计模式
Java设计模式之单例模式
最新推荐文章于 2025-03-01 23:26:28 发布