设计模式--1.单例设计模式举例深入解析

设计模式:之前别人总结的一套解决特定问题的较优代码

单例设计模式:

1.作用:

在应用程序中保证最多只能有一个实例。

2.好处:

2.1

提升运行效率(就一个对象,当再次使用该对象时,就不用再去new了,即不用再次重新进行类加载过程,把该对象的地址取到就行了)

2.2

可以实现数据共享(示例:application对象,该对象的有效范围:从tomcat开启到关闭,当使用setAttribute(key,value)设置一个数据时,该数据就一直处于共享状态,通getAttribute(key)来获取,application对象在tomcat启动时创建,可以通过getServletContext()来获取)

3.懒汉式

3.1 对象只有被调用时才去创建

3.2 示例代码

package singleton;
/**
 * 懒汉式:对象只有被调用时才去创建对象
 * @author YJL
 */
public class LazySingleTon {
	/**
	 * 由于属性需要被静态方法调用,则把属性设置为static
	 */
	private static LazySingleTon singleTon;
	/**
	 * 1.构造方法特点:
	 * 方法名和类名相同
	 * 无返回值
	 * 2.构造器私有化:
	 * 是为了其它类不能实例化这个类对象
	 * 3.为了可以获取该对象
	 * 则由必须对外提供访问入口(即下面的getInstance()方法)
	 */
	private LazySingleTon() {
		
	}
	/**
	 * 因为实例方法必须通过对象调用,而现在构造器是private,
	 * 不能在外部通过new来创建对象了
	 * 
	 * 则用类方法(即加上static)
	 * @return
	 */
	public static LazySingleTon getInstance() {
		//添加逻辑如果实例化过了,就直接返回
		if(singleTon == null) {
			/**
			 * 多线程访问下,可能出现if同时成立的情况,所以添加锁
			 * 一加了锁,就表示要排队
			 * 如果不加锁,就会线程不安全,
			 * 加锁后效率就会相对低
			 */
			synchronized (LazySingleTon.class) {
				//双重验证
				if(singleTon==null){
					singleTon = new LazySingleTon();
				}
			}
		}
		return singleTon;
	}
}

3.3测试代码:

package singleton;
public class Test {
	public static void main(String[] args) {
		LazySingleTon s1 = LazySingleTon.getInstance();
		LazySingleTon s2 = LazySingleTon.getInstance();
		System.out.println(s1==s2);
	}
}

结果为true.

3.4:

因为懒汉式代码中添加了锁,导致效率低。

4.饿汉式

4.1:

 解决了懒汉式中多线程访问可能出现同一个对象和效率低的问题

4.2 示例代码

package singleton;

public class HungrySingleTon {
	/**
	 * 在类加载时进行实例化
	 */
	private static HungrySingleTon singleTon2 = new HungrySingleTon();
	private HungrySingleTon() {
		
	}
	public static HungrySingleTon getInstance() {
		return singleTon2;
	}
}

4.3 :

相对于懒汉式,饿汉式线程安全,效率高,但也相对浪费空间,因为不管是否调用都进行了实例化(加载类的时候就实例化了),而懒汉式则什么时候调用就什么时候实例化对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值