【深入学习设计模式】——单例模式

简介: 【深入学习设计模式】——单例模式

前言


单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

 

其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问法。

 

为什么需要使用单例模式:

 

在应用系统开发中,我们常常有以下需求:


    - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象

    - 在整个程序空间使用全局变量,共享资源

    - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

 

因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

 

单例模式实现


饿汉式


public class Person {
  public static final Person person = new Person();
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  //构造函数私有化
  private Person() {
  }
  //提供一个全局的静态方法
  public static Person getPerson() {
    return person;
  }
}

从上面的代码中我们可以看出来饿汉式是不会存在线程安全的,因为我们是new对象放在了最前面,但是这种做法会浪费资源。

 

懒汉式

public class Person2 {
  private String name;
  private static Person2 person;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  // 构造函数私有化
  private Person2() {
  }
  // 提供一个全局的静态方法
  public static Person2 getPerson() {
    if (person == null) {
      person = new Person2();
    }
    return person;
  }
}

上面代码看似没有什么问题,当在单线程下面中运行时没有问题,但是当出现多线程的时候就会出现并发问题,也就是当多个线程同时运行if判断时候,就会出现多个实例,有点基本功的程序员都能看懂这段代码,在这就不在废话。

 

使用synchronized关键字解决并发问题

public static synchronized Person3 getPerson() {
    if(person == null) {
      person = new Person3();
    }
    return person;
  }


这种方式虽然可以解决并发问题,但是在访问量大的时候会非常的影响性能,所以不太建议使用这种方式,因为我们只需要同步部分代码,并不是整个方法。

 

双重检查机制

  public static Person4 getPerson() {
    if(person == null) {
      synchronized (Person4.class) {
        if(person == null) {
          person = new Person4();
        }
      }
    }
    return person;
  }

这是比较好的方式,这种方式可能在第一次执行这段代码的时候会比较慢一些,因为使用了双重判断,但是当第一次初始化完成以后,后面的效率则会大大增加。


小结

单例模式是我们必须掌握的一个模式,在项目中用的非常多,尤其是后面的双重检查机制,需要我们好好的体会并发情况下的好处!

目录
相关文章
|
3天前
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
|
8天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
14 2
|
22天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
29 4
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
14天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
19 1
|
22天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
23 0
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
25 0
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
本教程详细讲解了Kotlin中的单例模式实现,包括饿汉式、懒汉式、双重检查锁、静态内部类及枚举类等方法,适合需要深入了解Kotlin单例模式的开发者。快速学习者可参考“简洁”系列教程。
36 0
|
2月前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###