面向对象编程设计模式------单例模式

单例模式

        Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

        1、私有化类的构造函数,防止类外部的代码创建该类的实例。

        所有类都有构造方法,不编码则系统默认生成空的构造方法,若有显示定义的构造方法,默认的构造方法机会失效。

        2、有一个可以获取该类实例的公共方法,该方法要是静态的。

        单例模式也有常见的两种模式:

 

饿汉式单例

/**
 * 
 * @Description: 单例模式,饿汉式
 *
 * @author: zxt
 *
 * @time: 2018年3月13日 下午3:31:29
 *
 */
public class Singleton2 {
	// 本类类型的私有成员变量,在初始化时即创建类的实例,会提前占用系统资源,不过更加安全
	private static Singleton2 instance = new Singleton2();

	// 构造方法,设计成私有的,防止外部代码的访问,只允许内部构造
	private Singleton2() {
		// 构造逻辑
	}

	// 提供了一个供外部访问本class的静态方法,返回本类的一个实例
	public static Singleton2 getInstance() {
		return instance;
	}
}

这种方式静态初始化自己的唯一实例,需要提前占用系统资源,但是多线程访问时较安全。

 

懒汉式单例

/**
 * 
 * @Description: 单例模式,懒汉式
 *
 * @author: zxt
 *
 * @time: 2018年3月13日 下午3:13:51
 *
 */
public class Singleton {

	// 本类类型的私有成员变量
	private static Singleton instance;

	// 构造方法,设计成私有的,防止外部代码的访问,只允许内部构造
	private Singleton() {
		// 构造逻辑
	}

	// 提供了一个供外部访问本class的静态方法,返回本类的一个实例
	// 由于本类的构造方法私有化,外部无法调用,所以访问接口必须设计成静态的,通过类名即可访问
	public static Singleton getInstance() {
		// 在第一次使用时才生成实例,称为懒汉式单例,效率更好,但是存在多线程访问不安全的问题
		if (instance == null) {
			instance = new Singleton();
		}

		return instance;
	}

	// 多线程同时访问时,可能会创建多个实例,此时需要使用锁来保证实例唯一
	public synchronized static Singleton getInstance2() {
		// 对方法进行同步,会影响性能,所以需要考虑同步代码块,来改良
		if (instance == null) {
			instance = new Singleton();
		}

		return instance;
	}

	// 双重锁定
	public static Singleton getInstance3() {
		if (instance == null) {
			
			synchronized (Singleton.class) {
				// 二次检查保证同时判断instance为空的进程只有一个进入同步代码区
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

懒汉式单例是在类实例第一次访问的时候创建,这样效率更高,但是当多线程同时访问时,可能造成创建多个实例。所以需要使用锁,设置临界区代码,当有一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直至该对象被释放。

 

其他实现单例的方法还有:静态内置类,static代码块,枚举等。

 

Github源代码地址:https://github.com/zengxt/DesignPatterns

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值