创建型设计模式(2):单例模式


单例模式的使用场景,

  1. 想确保任何情况下都绝对只有一个实例
  2. 在程序上表现出只存在一个实例

依据上面的使用场景,得出单例模式的构建,

  • 只有一个实例
  • 该实例对象由该类本身创建
  • 提供全局访问点能够对该实例对象进行获取

1.代码实现

单例模式的主要角色是单例类,该类中通常包含如下实现,

  1. 私有的构造方法
  2. 私有的类成员变量
  3. 公有的类实例对象访问方法

懒汉式实现

  1. 懒汉式的实现一定注意线程安全
public class Singleton{
	// 使用类变量缓存创建的实例, volatile保证该对象线程同步
	private static volatile Singleton instance = null;

	private Singleton() {}

	// 使用同步的形式保证线程安全
	public static synchronized Singleton getInstance() {
		if (instance == null)
			instance = new Singleton();

		return instance;
	}
}
  1. 测试懒汉式
public class Main{
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
	
		System.out.println(s1 == s2);	// true
	}
}

懒汉式的特点是,类加载时没有创建实例,而是在调用 getInstance 方法时才去创建单例,所以就会存在线程安全性问题。但是每次访问都有同步问题,消耗资源,影响性能

所以建议使用饿汉式。

饿汉式实现

public class Singleton {
	private static final Singleton instance = new Singleton();

	private Singleton() {}

	public static Singleton getInstance() {
		return instance;
	}
}

饿汉式就比较好理解,直接在类创建的同时就生成静态成员变量供外部使用,即预先加载法,所以不存在线程安全性问题。

2.单例模式优缺点

  1. 单例模式一般难以拓展,一旦拓展基本上一定会对代码进行修改
  2. 单例模式与单一职责原则冲突。一个类,通常只关心它要实现的业务逻辑,但是单例模式既要关心自己是否单例,又要实现业务逻辑,融合性比较高。

3.单例模式使用场景

单例模式只有一个实例,常见的使用场景有,

  1. 要求生成唯一序列号的环境
  2. 网站计数器,采取单例模式有助于同步
  3. 文件系统、打印机、资源管理器等,因为底层资源只能同时被一方操纵,所以这些模块暴露的接口必然是单例的
  4. Java 中的 dao、service 一般都是单例的,而 action 层一般都是多例。

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值