首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JAVA设计模式之单例模式

什么是设计模式

设计模式简单来说就是工程师们经过长期编程,总结的一套固定的编程模式,就像盖房子,本来是随便盖的,但是经过长期实践,建筑者们形成了一套建筑的固定套路,比如哥特式建筑怎么建,四合院怎么建等等。

对应到程序员的软件工程行业,我们其实也是在建造“屋子”,这套设计模式就是我们编程的基本思路。

设计模式有很多种,这里介绍其中最简单也最常用的单例模式。

单例模式实现懒汉模式(单线程,类加载时不初始化,线程不安全)

由于单例模式下,该对象只能生成一次,所以重构该类的默认构造方法为Private,但是这样又导致其他类无法访问,所以定义一个public的获取对象的方法getInstance(),该方法表明,当对象不存在时new一个类对象,否则返回对象,这样就实现了只能创建一个实例。

在其他类中,调用这个方法获取该类的实例。

测试类:

懒汉模式进阶版本(单线程,单线程,类加载时不初始化)

这里和前一个模式的唯一区别在于新加了一个synchronized,这是因为在多线程的情况下,如果两个线程同时运行到判断instance是否为null的if语句时,并且instance的确没有创建时,那么两个线程都会创建一个实例,此时Singleton就不能满足单例模式的要求了。

为了保证在多线程环境下我们还只能得到类的一个实例,需要加上一个同步锁。

饿汉模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)

这种方法不会有线程问题,但是缺点是它不是一种懒加载模式式(lazyinitialization),单例会在加载类后一开始就被初始化,即使客户端没有调用 getInstance()方法。

最优办法:静态内部类 实现单例模式

由于 SingletonHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它是懒汉式的;同时读取实例的时候不会进行同步,没有性能缺陷;

另外:

有人提问,例模式跟全局变量有什么区别?

他们的区别在于:全局变量是一个变量,存在于某个具体的类中,而单例是一个对象,可以存在于整个应用。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180604G0CHKW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券