Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >复习:GoF的23种设计模式之Singleton模式(创建型)

复习:GoF的23种设计模式之Singleton模式(创建型)

作者头像
营琪
发布于 2019-12-25 08:07:52
发布于 2019-12-25 08:07:52
31400
代码可运行
举报
文章被收录于专栏:营琪的小记录营琪的小记录
运行总次数:0
代码可运行

Singleton模式(单例)

此模式也是我们不知不觉就会使用到的设计模式,例如我们将 配置文件映射为对象时,全局获取配置信息都使用此相同的对象。

单例模式,使用在,单例对象的类确保任何情况下都绝对只有同一个实例,整个系统都使用同一个对象。也就是 一个类只能有一个引用和一个实例方法。

单例模式在Java中有两种方式

根据单例对象的类初始化的不同分为两种构建方式:

懒汉方式,指系统启动完成后,第一次被使用时构建。

饿汉方式,指系统启动时,类装载时构建(即未被使用就已经构建)。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.luoweiying.singleton;

public class SingletonTest {
    public static void main(String[] agrs) {
        EagerSingleton singleton = EagerSingleton.getSingleton();
        EagerSingleton singleton_two = EagerSingleton.getSingleton();
        if (singleton == singleton_two) {
            System.out.println("两个比较的对象为同一个对象");
        }
        LazySingleton lazySingleton = LazySingleton.getSingleton();
        EnumSingleton instance = EnumSingleton.INSTANCE;
        System.out.println(instance);
    }
}

class EagerSingleton {
    private static EagerSingleton singleton = new EagerSingleton();
    private EagerSingleton() {
        System.out.println("私有构造,静态代码块初始化此类");
        System.out.println("饿汉方式,指系统启动时,类装载时构建(即未被使用就已经构建)");
    }
    public static EagerSingleton getSingleton() {
        return singleton;
    }
}

class LazySingleton {
    private static LazySingleton singleton = null;
    private LazySingleton() {
        System.out.println("懒汉方式,指系统启动完成后,第一次被使用时构建");
    }
    public static LazySingleton getSingleton() {
        if (null == singleton) {
            synchronized (LazySingleton.class) {
                if (null == singleton) {
                    singleton = new LazySingleton();
                }
            }
        }
        return singleton;
    }
}

enum  EnumSingleton{
    //定义一个枚举对象,此对象就是单例对象
    INSTANCE;

    @Override
    public String toString() {
        return "枚举创建的单例对象,防止序列化与反序列化破坏单例对象";
    }
}

UML类图

注意:序列化与反序列化会破坏单例对象

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【设计模式-单例模式】
今天来说一下同样属于创建型模式的单例模式,相信这个模式普遍都清楚,因为平时在编码的时候都会进行相应的使用,我这边就当做日志记录一下。免得以后忘了还得去搜,我发现我记忆里非常差,很多东西很快就忘记了,年纪大了没办法。
Liusy
2020/09/01
5550
【设计模式-单例模式】
单例设计模式
# 单例模式需要满足: 私有的构造函数 懒加载 线程安全 通过静态方法来访问实例 无法通过反射来实例化对象 无法通过反序列化来实例化对象 1. 饿汉模式 package com.futao.springbootdemo.design.pattern.gof.a.singleton; /** * 单例模式1-饿汉模式,即在类加载的时候就实例化对象。 * * @author futao * Created on 2018-12-25. */ public class EagerSingleton {
喜欢天文的pony站长
2020/06/29
3300
单例设计模式
Java 设计模式 | 单例模式
单例模式,是设计模式中最常见的模式之一,它是一种创建对象模式,用于产生一个对象的具体实例,可以确保系统中一个类只会产生一个实例。
utopia
2023/03/20
4350
Java 设计模式 | 单例模式
单例模式 创建型 设计模式(六)
可以借助于全局变量,但是类就在那里,你不能防止实例化多个对象,可能一不小心谁就创建了一个对象
noteless
2018/11/21
4570
设计模式 | 创建型 | 单例模式
一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
被水淹没
2023/02/25
4460
设计模式 | 创建型 | 单例模式
Java设计模式学习记录-单例模式
前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式。 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个。 单例模式 单例模式的实现方式  实现单例模式的方式有很多种,大体上可以划分为如下两种。 外部方式 在使用某些全局对象时,做一些“try-Use”的工作。就是如果要使用的这个全局对象不存在,就自己创建一个,把它放到全局的位置上;如果本来就有,则直接拿来使用。 内部实现方式 类型自己控制正常实例的数量,无论客户程序是否尝试过
纪莫
2018/07/04
3890
Java单例模式的7种写法中,为何用Enum枚举实现被认为是最好的方式?【享学Java】
如果看到标题就能表示赞同的小伙伴,那估摸你也肯定看过Joshua Bloch大神说过的这么一句话:单元素的枚举类型已经成为实现Singleton的最佳方法。我把它翻译成人话就是:实现单例模式的最佳方法是使用枚举。
YourBatman
2019/09/03
13.5K0
死磕GOF23之单例模式
Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides 四人合著出版了一本名为Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。
程序新视界
2022/05/09
2940
朋友问我单例模式是什么?
某软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高了系统的整体处理能力,缩短了响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和请求的分发,否则将会带来服务器状态的不一致以及请求分配冲突等问题。如何确保负载均衡器的唯一性是该软件成功的关键,试使用单例模式设计服务器负载均衡器。
千羽
2021/12/29
4950
朋友问我单例模式是什么?
详解设计模式@单例的进化之路
单例模式(Singleton Pattern)是设计模式中一个重要的模式之一,是确保一个类在任何情况下都绝对只有一个实例。单例模式一般会屏蔽构造器,单例对象提供一个全局访问点,属于创建型模式。
堆栈哲学
2023/03/08
2410
详解设计模式@单例的进化之路
单例模式详解
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
孟君
2019/08/29
5610
单例模式详解
一个单例模式,被问7个问题,难!
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式属于创建型模式,它提供了一种创建对象的最佳方式。
田维常
2022/04/19
7980
一个单例模式,被问7个问题,难!
23种设计模式之单例模式
单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。
用户2146693
2019/08/08
2880
23种设计模式之单例模式
钻钻 “单例” 的牛角尖
上篇文章 走进 JDK 之 Enum 提到过,枚举很适合用来实现单例模式。实际上,在 Effective Java 中也提到过(果然英雄所见略同):
路遥TM
2021/08/31
4550
单例设计模式源码分析,常用设计模式白话文总结 顶
通过该错误说明,该枚举类中无参数构造函数 2.使用java反编译技术,查看枚举类
须臾之余
2019/07/05
4320
单例设计模式源码分析,常用设计模式白话文总结
                                                                            顶
设计模式-单例
登记模式:是为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。他的子类实例化的方式只能是懒汉式
yiduwangkai
2020/02/24
2810
设计模式(二)单例模式Singleton(创建型)
几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销。再如大家最经常用的IM,如QQ,在同一台电脑,一个帐号只能有唯一的登录。
黄规速
2022/04/14
2380
设计模式(二)单例模式Singleton(创建型)
Java设计模式之单例模式
一般单例模式口诀:两私一公。 具体说就是私有构造方法、私有静态实例、公开的静态获取方法。
程裕强
2022/05/06
2590
Java设计模式之单例模式
【设计模式】之单例模式
单例模式是23种设计模式中最简单、最常见的一种,也是各个公司面试题中必考的设计模式之一,是程序猿必备掌握的。
xcbeyond
2020/04/02
3720
[设计模式]单例模式的n种写法
1.前言 写完这个题目,我感觉自己好像”孔乙己”啊,回字的四种写法要不要学啊~ 我们经常会用到单例模式,但是我对他一直没有一个统一的的认识,比如我清楚好多种单例的写法,但是每一种是怎么演化来的?具体解
呼延十
2019/07/01
5240
相关推荐
【设计模式-单例模式】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文