单例模式:保证一个类仅有一个实例

单例模式:保证一个类仅有一个实例

欢迎来到设计模式系列的第二篇文章!在上一篇中,我们已经对设计模式有了初步的了解,今天让我们深入研究第一个模式——单例模式。

什么是单例模式?

在软件开发中,我们经常会遇到这样的情况:一个类在整个应用程序的生命周期内只需要拥有一个实例。单例模式就是为了解决这样的需求而生的。它是一种创建型设计模式,确保一个类仅有一个实例,并提供全局访问点。

为什么需要单例模式?

单例模式在许多场景中非常有用。

首先,它可以节省系统资源,因为一个类的多个实例可能会占用大量的内存空间。

其次,它可以避免对同一资源的重复创建和销毁,提高系统性能。最重要的是,单例模式可以确保实例的一致性,避免因为多个实例导致的数据不一致问题。

单例模式的实现方式

单例模式有多种实现方式,下面我们介绍两种常用的方式:懒汉式和饿汉式。

  • 懒汉式:在第一次使用时创建实例。懒汉式的优点是节省了内存空间,但可能会引发线程安全问题。下面是一个懒汉式的示例:
public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {
        // 私有构造方法
    }

    public static LazySingleton getInstance() {
        if (instance == null) {
        	synchronized(LazySingleton.class) {
				if (instance == null) {
					instance = new LazySingleton();
				}
			}
        }
        return instance;
    }
}

在懒汉式中,我们在getInstance方法中通过synchronized**关键字来保证线程安全。在首次初始化时,在并发场景下,可以实现线程安全,并导致一定的性能问题,但是在后续方法调用时,就可以直接获取对象实例了。

  • 饿汉式:在类加载时就创建实例。饿汉式的优点是线程安全,但可能会造成不必要的资源浪费。下面是一个饿汉式的示例:
public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {
        // 私有构造方法
    }

    public static EagerSingleton getInstance() {
        return instance;
    }
}

在饿汉式中,实例在类加载时就被创建,因此在多线程环境下不会有线程安全问题。

单例模式的应用

让我们通过一个具体的例子来理解单例模式的应用。

假设我们在一个游戏中需要一个全局唯一的配置管理器,用于加载和管理游戏的配置文件。在这种情况下,我们可以使用单例模式来保证只有一个配置管理器实例存在。

public class ConfigurationManager {
    private Properties properties;

    private static ConfigurationManager instance;

    private ConfigurationManager() {
        // 私有构造方法
        properties = new Properties();
        // 加载配置文件
        try {
            properties.load(new FileInputStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static synchronized ConfigurationManager getInstance() {
        if (instance == null) {
        	synchronized(ConfigurationManager.class) {
				if (instance == null) {
					instance = new ConfigurationManager();
				}
			}
        }
        return instance;
    }

    public String getProperty(String key) {
        return properties.getProperty(key);
    }
}

在这个例子中,我们通过单例模式创建了一个全局唯一的配置管理器实例。无论在游戏的哪个地方都可以通过ConfigurationManager.getInstance()获取到相同的实例,并通过getProperty方法获取配置信息。

小结

单例模式是设计模式中最简单却也是最有用的一种。它解决了很多全局唯一实例的问题,确保了类的独一性和一致性。无论是懒汉式还是饿汉式,单例模式都能帮助我们构建更高效、更可靠的代码。

关注公众号,回复「书籍」、「视频」获取 "设计模式"经典书籍
单例模式:保证一个类仅有一个实例_第1张图片

你可能感兴趣的:(设计模式,单例模式,懒汉式,饿汉式,设计模式)