单例模式的5种形式

单例模式的5种形式

有过编程经验的朋友都知道设计模式中的单例模式,最近又重新看了一遍设计模式,今天将单例模式的几种形式介绍一下:

1、懒汉形式(延迟加载)

Singleton.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton{
    private static Singleton singleton;

    private Singleton() {
    }

    public synchronized static Single newInstance() {
        if (singleton== null) {
            singleton= new Singleton();
        }
        return singleton;
    }
}

这个是标准的单例模式,通过newInstance里面的判断来进行延迟加载单例对象,这里加了synchronized关键字可以避免多线程问题,但会影响程序性能。

2、饿汉形式(贪婪加载)

Singleton.java

1
2
3
4
5
6
7
8
9
10
public class Singleton {
    private static Singleton singleton= new Singleton();

    private singleton() {
    }

    public static Singleton newInstance() {
        return singleton;
    }
}

在单例对象声明的时候就直接初始化对象,可以避免多线程问题,但是如果对象初始化比较复杂,会导致程序初始化缓慢。

3、双重检查加锁

Singleton.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton newInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个是懒汉形式的加强版,将synchronized关键字移到了newInstance方法里面,同时将singleton对象加上volatile关键字,这种方式既可以避免多线程问题,又不会降低程序的性能。但volatile关键字也有一些性能问题,不建议大量使用。

4、Lazy initialization holder class

Singleton.java

1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton {
    private static class SingletonHolder {
        private static Singleton singleton = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton newInstance() {
        return SingletonHolder.singleton;
    }
}

这里创建了一个内部静态类,通过内部类的机制使得单例对象可以延迟加载,同时内部类相当于是外部类的静态部分,所以可以通过jvm来保证其线程安全。这种形式比较推荐。

5、枚举

Singleton.java

1
2
3
public enum Singleton {
    singleton
}

单因素的枚举类已经实现了单例,这种方法更加简单。

时间: 2024-08-28 09:02:20

单例模式的5种形式的相关文章

单例模式的两种形式(恶汉式,懒汉式)

单例模式的特点:解决了一个类在内存的唯一性,这个类的对象只有一个. 写单例模式的步骤: 1. 私有修饰构造方法 2. 在本类的成员位置, new 自己类的对象 3. 提供一个静态方法,返回本类的对象 A: 恶汉式 package demo01; /** * 单例设计模式恶汉式 * @author Administrator * */ public class SingleDesignModel1 { //私有构造方法 private SingleDesignModel1(){ } //在自己的成

Android 创建单例模式的几种方法

java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在.在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作.一些资源管理器常常设计成单例模式.外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中.每台计算

Android设计模式之单例模式的七种写法

一 单例模式介绍及它的使用场景 单例模式是应用最广的模式,也是我最先知道的一种设计模式.在深入了解单例模式之前.每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的实现. 事实上常常使用的图片载入框架ImageLoader的实例创建就是使用了单例模式.由于这个ImageLoader中含有线程池.缓存系统.网络请求,非常消耗资源,不应该创建多个对象,这时候就须要用到单例模式. ImageLoader的创建代码例如以下: ImageLoader.getInsta

单例模式的 几种写法

1 首先要知道,什么叫做单例模式. 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例 2 单例模式简介 单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因

python全栈开发【补充】单例模式的四种方式

一.什么是单例模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 二.优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量.静态变量(方法) 试问?为什么用单例模式,不用全局变量呢? 答.全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 三.使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接.Socket创建链接 四.单例模式的四种实现方式 # 1.模块导入的形式 s1.py class F

单例模式的四种方式

单例模式的四种方式 一.内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 二.角色 单利 三.使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接.Socket创建链接 四.优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量.静态变量(方法) 试问?为什么用单例模式,不用全局变量呢? 答.全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 五.单例模式的四种实现方式 1.文件导入的形式(常用

Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)

QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储

MyBatis collection的两种形式——MyBatis学习笔记之九

与association一样,collection元素也有两种形式,现介绍如下: 一.嵌套的resultMap 实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法.还是以教师映射为例,修改映射文件TeacherMapper.xml如下(点击此处进入嵌套resultMap形式的示例源码下载页面.注:本示例代码是在修改本系列的上篇博文示例代码的基础上完成的,用到了MapperScannerConfigurer和注解等知识.对这些知识不熟悉的读者,可参考上篇博文:http://legend20

C++ 单例模式的几种实现研究

都是从网上学得,整理下自己的理解. 单例模式有两种实现模式: 1)懒汉模式: 就是说当你第一次使用时才创建一个唯一的实例对象,从而实现延迟加载的效果. 2)饿汉模式: 就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象. 所以,从实现手法上看,  懒汉模式是在第一次使用单例对象时才完成初始化工作.因为此时可能存在多线程竞态环境,如不加锁限制会导致重复构造或构造不完全问题. 饿汉模式则是利用外部变量,在进入程序入口函数之前就完成单例对象的初始化工作,此时是单线程所以不会存在多线程的竞态环境