单例模式

Java常用的23种设计模式

v2-2468115597e7492aeec2e7962a83ea59_b.jpg

1、什么是单例模式?

百度百科是这样定义的:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例

我是这样理解的:单例模式就是只允许一个实例,最开始使用它的时候是C#中,我要实例化一个A窗体,但是有个需求就是A窗体必须是唯一,不管我在B窗体操作A窗体还是C窗体中操作A窗体都是如此,这时候就使用到了单例模式

2、单例模式分类

A、懒汉单例模式:在第一次调用的时候实例化本身,在并发环境下,可能出现多个本身对象。所以线程是不安全的

B、饿汉单例模式:在类初始化时,已经自行实例化一个静态对象,所以本身就是线程安全的

C、登记单例模式:通过一个专门的类对各单例模式的单一实例进行管理和维护

3、特点

A、 单例模式类只能有一个实例
B、 单例模式类必须自己创建自己的唯一实例
C、 单例模式类必须给所有其他对象提供这一实例

代码实现

1、懒汉单例模式

实现方式1:

/**
 * 描述:懒汉单例模式 ,双重检查锁定<p>
 */
public class Singleton {

	/**
	 * 该函数限制用户主动创建实例
	 */
	private Singleton() {}

	private volatile static Singleton singleton = null;

	/**
	 * 获取Singleton实例,也叫静态工厂方法
	 * @return Singleton
	 */
	public static Singleton getInstance() {
        Singleton inst = instance; // 创建临时变量  
		if (inst == null) {
			synchronized (Singleton.class) {
                inst = instance;  
				if (inst == null) {
					inst = new Singleton();
				}
			}
		}
		return inst;
	}

}

实现方式2:

/**
 * 描述:懒汉单例模式 ,静态内部类<p>
 */
public class Singleton {

	/**
	 * 静态内部类
	 *
	 */
	private static class LazyHolder {
		// 创建Singleton实例
		private static final Singleton INSTANCE = new Singleton();
	}

	/**
	 * 该函数限制用户主动创建实例
	 */
	private Singleton() {}

	/**
	 * 获取Singleton实例,也叫静态工厂方法
	 * @return Singleton
	 */
	public static final Singleton getInstance() {
		return LazyHolder.INSTANCE;
	}

}

静态内部类:静态内部类比双重检查锁定和在getInstance()方法上加同步都要好,实现了线程安全又避免了同步带来的性能影响。

2、饿汉单例模式

public class Singleton {

	/**
	 * 该函数限制用户主动创建实例
	 */
	private Singleton() {}
	private static final Singleton singleton = new Singleton();

	/**
	 * 获取Singleton实例,也叫静态工厂方法
	 * @return Singleton
	 */
	public static Singleton getInstance() {
		return singleton;
	}
}

3、容器单例模式

public class Singleton {

	// 存储需要进行维护和管理的类的实例
	private static Map<String, Singleton> map = new HashMap<String, Singleton>();
	
	/**
	 * 静态创建实例并添加到Map集合
	 */
	static {
		Singleton singleton = new Singleton();
		map.put(singleton.getClass().getName(), singleton);
	}

	/**
	 * 该函数限制用户主动创建实例
	 */
	private Singleton() {};

	/**
	 * 获取Singleton实例,也叫静态工厂方法
	 * @return Singleton
	 */
	public static Singleton getInstance(String name) {
		/* 根据指定的类的名称从map中获取实例并返回 */
		return map.get(name);
	}

	// 一个示例性的商业方法
	public String about() {
		return "你好,我是RegSingleton";
	}

	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance("com.Singleton");
		System.out.println(singleton.about());
	}
}

4、枚举(写法简单,线程安全)

public enum Singleton {  
    INSTANCE;  
}  

 

转载于:https://my.oschina.net/u/1993676/blog/859783

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值