设计模式之单例(一)

3 篇文章 0 订阅
3 篇文章 0 订阅

单例 
    一个类只有一个实例
    实现单例的三个步骤:
        1.私有化构造器
        2.在本类中创建唯一实例(静态的变量)
        3.提供一个公有的静态的get方法用于返回当前类的唯一实例
        
    饿汉
        当类一加载的时候就创建对象
        优点: 调用效率高, 线程安全的
        缺点: 如果这个类创建了一直没有使用, 则相当于浪费了资源
        

/**
 * 饿汉单例
   缺点:类初始化就new一个对象,如果不用会占用资源
   优点:线程安全,效率高()
 */
public class HungrySingle{
	private static HungrySingle INSTANCE = new HungrySingle();
	private HungrySingle{};
	public static HungrySingle getInstance(){
		return INSTANCE;
	}
}


        
    懒汉
        当类加载的时候不会创建对象, 只有当这个对象被显示获取时,
        才去创建对象
        优点: 实现了懒加载
        缺点: 调用效率较饿汉低, 线程不安全
        

/**
 * lazy单例
   优点:不需要再初始化时就new一个对象,节约系统资源
   缺点:每次使用都要new,如果参数很多,需要花费时间,效率低,而且线程不安全
 */
public class LazySingle{
	private LazySingle {}
	private static LazySingle INSTANCE;
	public static LazySingle getInstance(){
		if(INSTANCE == null){
			/*
			  如果线程1进入if之后没有立即new LazySingle();
			  此时线程2也要满足条件INSTANCE==null,进入if,也需要new LazySingle();
			  此时就破坏单例,多次new
			 */
			INSTANCE = new LazySingle();
			return INSTANCE;
		}else{
			return INSTANCE;
		}
	}
}


    
    静态内部类
        在类的内部定义一个私有的内部类, 在内部类中去创建唯一实例
        即实现了懒加载, 又保证了线程安全
        推荐使用

public class OutSingle{
	private OutSingle{};

	private static class InnerSingle{
		private static final OutSingle INSTANCE = new OutSingle();
	}
	public static final OutSingle getInstance(){
		return InnerSingle.INSTANCE;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值