一,初步理解

图片来源:菜鸟教程
如图所见,单例设计模式就是确保一个类只有一个实例
如现在的图中就是:
SingleObiect中只有一个实例,如果想得到这个唯一的实例,则需要
SingletonPatternDemo通过调用SingleObject.getInstance()
SingleObiect返回唯一的实例instance给SingletonPatternDemo
单例模式分为懒汉式和饿汉式,接下来为大家详细介绍
二,上题目
要求定义一个类A,该类A只能被实例化为一个唯一的对象!
本题对应的公共类和main函数定义如下:
javapublic class Main { public static void main(String[] args) { A o1 = A.getInstance(); A o2 = A.getInstance(); if (o1.equals(o2)) { System.out.println("o1与o2是同一个对象!"); } } }请完成A类的代码
显而易见,这里的Main 类就上述通用类图中的SingletonPatternDemo
那我们要完成的就是SingleObiect,也就是题目需要的A类啦

为大家分别介绍懒汉式和饿汉式:
理解懒汉式
为什么叫懒汉呢?先看代码:
java
class A {
// 1. 声明静态实例,但不立即初始化(懒加载)
private static A instance;
// 2. 私有化构造方法
private A() {}
// 3. 静态获取方法:首次调用时才创建实例
public static A getInstance() {
if (instance == null) { // 判空:为空才创建
instance = new A();
}
return instance;
}
}
可以看出,平时对instance是不管的,声明一个就放在那
要用的时候才懒洋洋的new一个对象
所以是懒汉式
关键:懒汉式怎么实现唯一实例的呢?
3个方面:
|---------------------------------------------------------------------------------|---------------------------|
| java private static A instance java public static A getInstance() | 声明静态实例与静态方法,不允许后续修改逻辑 |
| java private A() {} | 私有构造方法,不允许另外的对象创建 |
| java if (instance == null) { instance = new A(); } | 非空不创建,保证只有一个实例 |
理解饿汉式
依旧先看代码
java
// 单例模式(饿汉式)实现,保证唯一实例
class A {
// 1. 私有化静态实例:类加载时就创建唯一实例,保证全局唯一
private static final A instance = new A();
// 2. 私有化构造方法:禁止外部通过new创建实例
private A() {}
// 3. 公共静态方法:提供全局访问点,返回唯一实例
public static A getInstance() {
return instance;
}
}
可以看出,与懒汉不同,饿汉一开始就迫不及待创建实例,显然是饿了
所以是饿汉式
关键:饿汉式怎么实现唯一实例的呢?
3个方面:
|-------------------------------------------------------------------------------------------------|---------------------------------------|
| java private static final A instance = new A() java public static A getInstance() | 私有化静态实例:类加载时就创建唯一实例,保证全局唯一(final) |
| java private A() {} | 私有构造方法,不允许另外的对象创建 |
| | |
三,总结
单例模式(Singleton Pattern)
意图
确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
主要解决
频繁创建和销毁全局使用的类实例的问题。
何时使用
当需要控制实例数目,节省系统资源时。
如何解决
检查系统是否已经存在该单例,如果存在则返回该实例;如果不存在则创建一个新实例。
关键代码
构造函数是私有的。
设计模式系列持续更新,欢迎关注博主~
希望对大家有用,祝您开心~(o゜▽゜)o☆,有问题欢迎交流,俺会改的✊