设计模式之单例模式

单例模式

1、简介

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

单例模式一般分为懒汉模式和饿汉模式。

懒汉模式:即需要使用的时候才会主动去创建;

饿汉模式:即程序初始化的时候就会创建,缺点是,如果该实例,在程序运行过程中,一直未使用,则会造成内存浪费。

2、代码分析

单例模式实现思路:

  • 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
  • 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

本次直接来看使用最广泛的双重检查锁,线程安全,效率更高;

/**
 * 单例模式的思路就是,将构造方法私有化,不允许外单直接通过构造函数来创建类;
 * 直接通过静态方法来调用;
 */
public class PeopleSingle {
    private String name;
    private String age;

    /**
     * 懒汉模式,只有使用的时候才会去创建;
     */
    //饿汉,程序初始化的时候就会先创建,不常用,如果一直用不到会造成内存浪费;
//    private final static PeopleSingle instancePeople = new PeopleSingle();
    private static PeopleSingle instancePeople;

    private PeopleSingle() {
        System.out.println("方法被调用,创建了PeopleSingle");
    }
    public static PeopleSingle getPeople() {
        //双重检查锁
        if (instancePeople == null) {
            synchronized (PeopleSingle.class) {
                if (instancePeople == null) {
                    PeopleSingle people = new PeopleSingle();
                    instancePeople = people;
                }
            }
        }
        return instancePeople;
    }
}

测试代码:

public class InstanceTest {
    public static void main(String[] args) {
        PeopleSingle people1 = PeopleSingle.getPeople();
        PeopleSingle people2 = PeopleSingle.getPeople();
        //可以看到构造方法只被调用了一次,结果返回true;
        System.out.println(people1 == people2);
    }
}

上述代码执行结果返回true。

3、优点

系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。

4、缺点

当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候。

5、适用场景

  • 需要频繁创建和销毁的对象;
  • 创建和销毁消耗内存较多,但又经常使用的对象;
  • 工具类对象;
  • 频繁访问数据库或文件的对象;
posted @ 2022-06-19 21:04  进阶的蜗牛  阅读(33)  评论(0)    收藏  举报