Head First 设计模式 —— 单例模式(Singleton)

单例模式简要定义:单例模式确保一个类只有一个实例,并提供一个全局访问点

1. 如何保证一个类只有一个实例,且这个实例易于被访问?

lazy evaluation:在用到的时候才创建对象。

  • 全局变量:
    • 使得一个对象可以被访问,全局访问点;
    • 但不能防止实例化多个对象;
    • 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象。但是,如果这个对象非常耗费资源,而程序在执行的过程中又一直没有用到它;造成浪费;
  • 单件模式(singleton)提供了一个全局的访问点,像全局变量一样方便,又没有全局变量的缺点(单件类可以延迟实例化);

2. Java 经典实现


public class Singleton {
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
    private Singleton() {}
    private static Singleton uniqueInstance; 
}
  • 在多线程环境下,有可能在一个线程进入 if 判断之后,还未创建赋值对象之前,又有新的线程进入 if 判断,这样就无法保证对象的唯一性;
  • 增加 synchronized 关键字到 getInstance 方法,这样使得在每个线程进入该方法之前,要先等候别的线程离开该方法,也就是说,不会有两个线程可以同时进入被 synchronized 修饰的方法;

3. 一些特殊需求的单例实现

  • 允许多次 new 创建实例,但每次 new 出来的对象都是同一个对象。

    只需将 getInstance()的实现放进构造函数即可:

    public class Singleton {
        public Singleton() {
            if (self) return;
            self = this;
        }
        private static Singleton self;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值