设计模式之单例模式(创建型模式)-程序员宅基地

技术标签: 单例  设计模式  

简介
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,任务管理器、线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。在项目当中,系统启动读取配置文件就需要单例保证配置的一致性。

要点与实现

要点

  • 一是某个类只能有一个实例
  • 二是它必须自行创建这个实例
  • 三是它必须自行向整个系统提供这个实例

实现

  • 一是单例模式的类只提供私有的构造函数
  • 二是类定义中含有一个该类的静态私有对象,
  • 三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

实现单例模式方式

  1. 饿汉式
/** 饿汉式单例模式*/
public class Singleton {

    private Singleton(){}//私有构造器

    /*
     * JVM只为静态分配一次内存,在加载类的过程中
     * 完成静态变量的内存分配,天然的是线程安全的
     */
    private static Singleton singleton=new Singleton();

    public static Singleton getInstance(){//静态工厂方法
        return singleton;
    }
}
  1. 懒汉式
/** 懒汉式单例模式*/
public class Singleton {

    private Singleton(){}//私有构造器

    private static Singleton singleton=null;//静态变量
	/**
     * 延迟加载,需要的时候初始化,方法加锁,并发效率低
     */
    public static synchronized Singleton getInstance(){
        if(singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
}
  1. 双重锁(饿汉式变种)
/**双重锁单例模式*/
public class Singleton {

    private Singleton(){}//私有构造器

    private static volatile Singleton singleton=null;//静态变量 可见性和指令重排序都保证

    /**
     * 避免整个方法被锁,只对需要锁的代码部分加锁,可以提高执行效率。
     */
    public static Singleton getInstance(){
        if(singleton==null){
            synchronized (Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();//非原子操作
                }
            }
        }
        return singleton;
    }
}
  1. 静态内部类实现
/**静态内部类模式*/
public class Singleton {

    private Singleton(){}//私有构造器

    private static class SingletonClassInstance{
        //static final 保证对象只会被赋值一次
        private static final Singleton instance=new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonClassInstance.instance;
    }
}
  1. 静态代码块实现
/**静态代码块实现**/
public class Singleton {
    private Singleton(){}//私有构造器
    private static Singleton singleton=null;//静态变量
	//静态代码块
    static {
        singleton=new Singleton();
    }

    public static Singleton getInstance(){
        return singleton;
    }
}
  1. 枚举类实现
/*枚举的单例模式*/
public class Singleton {
    private Singleton (){}//私有构造
    public static Singleton getInstance(){
        return SingletonEnum.INSTANCE.getInstance();
    }
    /*目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,
     *因为JVM会保证enum不能被反射并且构造器方法只执行一次。*/
    private enum SingletonEnum{
        INSTANCE;
        private Singleton singleton;
        //JVM会保证此方法绝对只调用一次
        private SingletonEnum(){
            singleton=new Singleton();
        }
        public Singleton getInstance(){
            return singleton;
        }
    }
}

反射攻击示例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37209293/article/details/88978046

智能推荐

运算符的先后顺序_自称自觉运算服务的先后顺序-程序员宅基地

计算下列的表达式public static void main(String[] args) { int i = 5; int j = i+++i+++i++; System.out.println(j); int k = 0; int o = ++k+k<<2+ ++k+k+1; System.out.println(o); }"C:\Program Files\Java\jdk1.8_自称自觉运算服务的先后顺序

html文件在win10保存会是什么图标,Win10系统任务栏里的小图标都保存在什么文件夹里具体路径是什么...-程序员宅基地

导语:许多win10用户都喜欢将常用的应用程序快捷方式图标固定在任务栏上,这样就可以单击这个图标快速启动软件。那么你知道任务栏图标存放在哪个文件夹里面吗? 下面白豆芽就和大家分享Win10系统任务栏里的小图标都保存在什么文件夹里具体路径是什么。一般来说任务栏图标文件夹在用户文件夹内,不同的登录用户文件夹路径也是不同的。找到任务栏图标文件夹技巧:1、按住SHIFT,然后右键点击图标,我们可以看到“复..._win10 html文件放在哪

手把手教你python面向对象编程入门_python学习之面向对象【入门初级篇】-程序员宅基地

前言最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。概述python支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。面向过程:根据业务逻辑从上到下写垒代码函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数进行分类和封装,让开发“更快更好更强...”OOP思想面向对象的基本..._ython支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。面向过程:

嵌入式linux驱动详解,详解嵌入式Linux设备驱动篇module_init-程序员宅基地

描述一直以来写linux驱动,都是按照固定格式,定义一个初始化和退出函数,书上告诉我这两个函数会被调用,至于为什么会被调用,在哪调用,一直不清楚。偶然的一个机会,看到blob里面的代码,里面有一个初始化函数列表。按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如:void init(void){init_a();init_b();}如果再加入一个初始化函数呢,那么再init_b()...

使用andbug的monitor命令-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

Hive的元数据信息_hive元数据中包含-程序员宅基地

Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的)。通过Mysql进行示例说明:Hive数据仓库中: MySql数据库中存储的相应元数据信息: Navicate(远程连接的MySql)对应的元数据信息: Hive中创建的表在hive中可以看到正常的数据,但是在mysql中只能查到hive中表的元数据信息。..._hive元数据中包含

随便推点

UIWindow, UIView和UIViewController-程序员宅基地

在iPhone开发中,一个应用程序应该只有一个UIWindow的实例,UIWindow在iPhone中是UIView的一个特殊子类,在程序初始化时,通过装载MainWindow.xib或者在代码中创建,它的大小应该就是手机屏幕的大小,并且不应该像普通的UIView一样,设置UIWindow实例——一个特殊的UIView实例——的UIView中的属性。一个UIView的实例就是一个视图,...

【深度】生态红利即将爆发,剖析阿里云市场软件交易与交付新战略-程序员宅基地

耳熟能详的阿里云背后,有一支成立两年却鲜为人知,始终低调摸索云生态建设的团队——云市场。云市场,也是阿里云官网上的软件市场。顾名思义,是阿里云打造的、针对第三方软件和服务的交易平台。阿里云业务运营事业部总经理杨名解读云市场新战略4月20日,云栖大会深圳峰会,以“云市场,大生态”为主题的《云市场专场》上,阿里云业务运营事业部总经理杨名..._阿里云第三方应用市场定位

谷粒学院项目_自行整理笔记_谷粒学苑技术栈-程序员宅基地

技术栈:Redis、Nginx、Springboot、maven、Git第一天项目背景在线教育:网络教学商业模式B2B2C、B2C(管理员和普通用户)功能模块系统后台(管理员):讲师管理模块、课程分类管理模块、课程管理模块、统计分析模块、订单管理模块、banner模块(轮播图)、权限管理模块系统前台(普通用户):首页数据显示、讲师列表和详情、课程列表和课程详情、登录和注册功能、微信扫码登录、微信扫码支付技术栈前后端分离开发:后端技术:Springboot、Spr_谷粒学苑技术栈

vim配置——C/C++代码自动补全_vim写代码时自动补全-程序员宅基地

配置vim主要分为两大部分:一个是通过set设置vim的属性;另一个是插件下载。_vim写代码时自动补全

【我的Android进阶之旅】解决Center OS 64位系统编译Android APP报错error=2和finished with non-zero exit value 127...-程序员宅基地

一、错误描述1、问题 java.io.IOException: error=2, 没有那个文件或目录 今天在刚重新搭建好的64位的Center OS上安装好了Android SDK,Jenkins,Git等一系列用于持续集成的环境之后,准备编译下项目试一试,然后Jenkins编译失败,错误如下所示:..._rubygrapefruit.platform.internal.defaultprocesslauncher.start(defaultprocess

javascript 格式化数字 千分位加逗号小数点-程序员宅基地

为什么80%的码农都做不了架构师?>>> ...

推荐文章

热门文章

相关标签