《Java设计模式及实践》—2 创建型模式

举报
华章计算机 发表于 2019/07/22 11:14:27 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第2章,第2.1.1节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

第2章

创建型模式

本章主要介绍了创建型模式(Creational Pattern)。创建型模式主要用于处理对象的创建问题,本章主要介绍以下内容:

  • 单例模式

  • 工厂模式

  • 建造者模式

  • 原型模式

  • 对象池模式

2.1 单例模式

自Java语言推广使用以来,单例模式(singleton pattern)就是最常用的设计模式,它具有易于理解、使用简便等特点。有时单例模式会过度使用或在不合适的场景下使用,造成弊大于利的后果,因此,单例模式有时被认为是一种反模式。但是很多情况下单例模式是不可或缺的。

单例模式,顾名思义,用来保证一个对象只能创建一个实例,除此之外,它还提供了对实例的全局访问方法。单例模式的实现方式如图2-1所示。

 image.png

图 2-1

单例模式的实现非常简单,只由单个类组成。为确保单例实例的唯一性,所有的单例构造器都要被声明为私有的(private),再通过声明静态(static)方法实现全局访问获得该单例实例。实现代码如下所示:

 image.png

当我们在代码中使用单例对象时,只需进行简单的调用,代码如下所示:

 image.png

在getInstance方法中,需要判断实例是否为空。如果实例不为空,则表示该对象在之前已被创建;否则,用新的构造器创建它。经过这些操作,无论是哪种情况,实例都不再为空,可以返回实例对象。

2.1.1 同步锁单例模式

单例模式的实现代码简单且高效,但还需注意一种特殊情况,在多线程应用中使用这种模式,如果实例为空,可能存在两个线程同时调用getInstance方法的情况。如果发生这种情况,第一个线程会首先使用新构造器实例化单例对象,同时第二个线程也会检查单例实例是否为空,由于第一个线程还没完成单例对象的实例化操作,所以第二个线程会发现这个实例是空的,也会开始实例化单例对象。

上述场景看似发生概率很小,但在实例化单例对象需要较长时间的情况下,发生的可能性就足够高,这种情况往往不能忽视。

要解决这个问题很简单,我们只需要创建一个代码块来检查实例是否空线程安全。可以通过以下两种方式来实现。

  • 向getInstance方法的声明中添加synchronized关键字以保证其线程安全:

 image.png

  • 用synchronized代码块包装if (instance == null)条件。在这一环境中使用synch-ronized代码块时,需要指定一个对象来提供锁,Singleton.class对象就起这种作用。如以下代码片段所示:

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。