Java设计模式之单例模式

  • 单例模式

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  • 适用性

    1)当只需要创建一个对象时。

  • 举例

    例如世上只有一个中国,只能创建一个中国对象。
    例如只有一个北京,对象也只能创建一个。

  • UML类图
    单例模式(Singleton)

  • 代码示例

    • 单例模式-饿汉模式
      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种设计模式查看更多的设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值