Java设计模式之单例模式的设计思路与具体实现
程序员文章站
2022-04-19 09:09:58
文章内容输出来源:拉勾教育大数据训练营;单例模式的设计思路与具体实现Java中的一个类,理论上可以创建无数个对象。假如我们只允许一个类创建一个对象,就需要会使用单例模式来设计该类。单例模式的应用场景1. Windows的任务管理器、回收站等;2. 网站的计数器;3. 数据库连接池的设计;...单例模式的设计思想首先,一个类可以成功创建一个对象是因为在new对象的时候自动执行了该类默认的空构造,这个默认构造是公有的/public,所以我们可以在类外部无限new对象。由此,我们可以得到...
文章内容输出来源:拉勾教育大数据训练营;
用单例模式设计类
Java中的一个类,理论上可以创建无数个对象。
假如我们只允许一个类创建一个对象,就需要会使用单例模式来设计该类。
单例模式的应用场景
Windows的任务管理器、回收站; 网站的计数器; 数据库连接池的设计;…
单例模式的设计思想
首先,一个类可以成功创建一个对象是因为在new对象的时候自动执行了该类默认的空构造,这个默认构造是公有的/public,所以我们可以在类外部无限new对象。
由此,我们可以得到第一步设计思路: |
自定义一个构造方法,将该构造方法设计为私有的/private。
(但此时在该类外部一个对象也创建不出来)
私有化构造方法后,在类外部无法创建对象,那么我们可以考虑在该类内部直接创建对象。
则有第二步设计思路: |
首先在该类内部声明一个本类类型的引用指向本类类型的对象;
然后用 private static 共同修饰该对象。
(使用 private 修饰是为了保证在该类外部无法得到该对象;
使用 static 修饰是为了保证这个对象仅创建一次,即只在类加载的时候创建一次)
对象创建完成后,我们只需要在类中再创建一个公有的静态访问方法,来保证我们可以在该类外部拿到这个唯一创建的对象。
第三步设计思路: |
提供一个公有的静态get方法,该方法的返回值类型为本类类型。
即 public static 修饰该方法。
(使用static修饰该方法是因为本类已无法在外部new对象,不用static修饰的话也就无法调用该方法)
至此,单例模式的设计就已全部完成。
以上设计思路得到的是单例模式的饿汉式,饿汉式与懒汉式的区别下边会讲到。我们先通过饿汉式的代码实现对照上述设计思路来理解单例模式的设计过程,明白它为什么只能new出一个对象。
饿汉式代码实现
// 单例模式之饿汉式
public class SingletonForHungry{
// 第一步:私有化构造方法
private SingletonForHungry() {}
// 第二步:声明本类类型的引用指向本类类型的对象
private static SingletonForHungry sh = new SingletonForHungry();
// 第三步:提供公有的静态get方法将对象返回
public static SingletonForHungry getInstance() {
return sh;
}
}
单例模式的饿汉式和懒汉式
- 饿汉式:在声明对象的时候直接创建对象,在get方法中直接返回;
- 懒汉式:在声明对象的时候先声明为null对象, 然后在get方法中判断该对象为null时创建本类对象,否则返回已存在的对象;
懒汉式代码实现
// 单例模式之懒汉式
public class SingletonForLazy{
// 第一步:私有化构造方法
private SingletonForLazy() {}
// 第二步:声明一个本类类型的null对象
private static SingletonForLazy sl = null;
// 第三步:提供公有的静态的get方法将对象返回
public static SingletonForLazy getInstance() {
// 判断sl是否为null
if (null == sl) {
sl = new SingletonForLazy();
}
return sl;
}
}
测试验证
验证这两种设计模式是否分别仅能得到一个对象
public class SingletonTest {
public static void main (String[] args) {
// 饿汉式
SingletonForHungry sh1 = SingletonForHungry.getInstance();
SingletonForHungry sh2 = SingletonForHungry.getInstance();
System.out.println(sh1 == sh2);
// 懒汉式
SingletonForLazy sl1 = SingletonForLazy.getInstance();
SingletonForLazy sl2 = SingletonForLazy.getInstance();
System.out.println(sl1 == sl2);
}
}
结果如下:
结果都为true,说明懒汉式和饿汉式的两个引用分别都指向的是同一个对象,单例模式设计正确。
拉勾的大数据训练营课程质量过关,课程体系设置合理,阶段性任务完成都会有实际操作项目。有授课老师,有答疑老师,有非技术方向的日常生活老师,任何方面的问题都能及时解决,推荐一下!^ ^
本文地址:https://blog.csdn.net/weixin_43102071/article/details/107284704