设计模式|单例模式

简介: 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式定义和使用场景


定义:


这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。


如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。


使用场景


  • 1、要求生产唯一序列号。


  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。


  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。


应用实例:


  • 1、一个班级只有一个班主任。


  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。


  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。


缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。


几种常见的单例模式实现


懒汉方式


  • 保证线程安全


  • 防止指令重排序


  • 双重检查优化


/**
 * 双重检查懒汉模式
 */
public class SingletonLazy {
    private volatile static SingletonLazy instance;
    private SingletonLazy() {
    }
    public static SingletonLazy getInstance() {
        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
}


饿汉方式


饿汉模式:是在类加载节点就完成了实例的初始化


类加载的3个阶段 (补充知识)

  • 加载 -> 加载对应的二进制文件,并且在方法区创建对应的数据结构
  • 链接 -> a. 验证,b. 准备,c. 解析
  • 初始化 -> 给静态属性赋初始值


饿汉模式示例


public class SingletonHungry {
   //静态变量在类加载的时候进行赋值
    private static SingletonHungry instance = new SingletonHungry();
    private SingletonHungry() {
    }
    public static SingletonHungry getInstance() {
        return instance;
    }
}


内部类方式


因为一个类只会被加载一次所以可以利用这个特征来初始化单实对象。


/**
 * 静态内部类方式
 */
public class SingletonInner {
    static class InnerClass {
        private static SingletonInner instance = new SingletonInner();
    }
    public static SingletonInner getInstance() {
        return InnerClass.instance;
    }
    private SingletonInner() {
        if (InnerClass.instance != null) {
            throw new RuntimeException("单例不允许有多个示例!");
        }
    }
}


枚举方式


枚举是一个单例的实力


public class SingletonEnum {
    private SingletonEnum() {
    }
    private enum SingletonInnerEnum {
        INSTANCE;
        private SingletonEnum instance;
        SingletonInnerEnum() {
            this.instance = new SingletonEnum();
        }
        public SingletonEnum getInstance() {
            return instance;
        }
    }
    public static SingletonEnum getInstance() {
        return SingletonInnerEnum.INSTANCE.getInstance();
    }
}


参考文档





相关文章
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
37 2
|
1月前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
33 2
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
50 4
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
30 1
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
33 0
|
3月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
3月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
120 1

热门文章

最新文章