-
单例模式实现全局只有一个对象实例。
-
实现单例模式需要满足的条件:
- 构造方法私有。
- 用一个私有的,静态引用类型实例变量。
- 提供一个公有的,静态方法来获得该实例。
对于单例设计模式实现的方式不只是这两种,等知识深入之后,我们再来进行优化。
模式,其实就是解决某一类问题的方法论,你把解决某类问题的方法总结归纳到理论高度那就是模式。 😮
不同的领域有不同的模式,像建筑领域有建筑模式,软件设计领域有设计模式,当一个领域逐渐成熟的时候,自然会出现很多模式。
经典的软件设计模式一共有 23 种,而本实验讲的单例模式是最简单的一种设计模式。 😊
单例设计模式,就是需要实现全局就一个对象实例。
就像电脑键盘按下 Ctrl+Alt+Del 键打开的 Windows 任务管理器,无论如何我们都不能打开两个任务管理器,这就是说明,它在系统中只有单一的实例。
👉 要实现单例设计模式,创建的类需要满足以下 3 个条件:
- 构造方法私有。
- 用一个私有的,静态引用类型实例变量。
- 提供一个公有的,静态方法来获得该实例。
接下来,我们分成两种方式来实现单例设计模式。
第一种实现方式:懒汉式。
🤔 那什么叫懒汉式呢?
懒汉式就是延迟加载,所谓延迟加载就是调用提供公共的静态的方法时实例才被创建出来。
实现代码如下:👇
class Singleton1{
// 私有的静态的引用类型变量
private static Singleton1 s;
// 私有的构造器
private Singleton1(){
}
// 公共的静态的可返回该类的实例
public static Singleton1 getInstance(){
if(s == null){
s = new Singleton1();
}
return s;
}
}
创建一个独立的类 Singleton1 ,声明一个私有的静态的 Singleton1 类型的变量 s ;提供一个私有的构造方法,不允许其他类中直接通过 new 创建对象;提供一个公共的静态的返回 Singleton1 类型的 getInstance() 方法,在方法体中,当 s 为 null 时,通过 new 创建 Singleton1 的对象,进行传递。
在 /home/project/ 目录下,创建 TestSingleton.java 源文件,代码如下:
/**
* 单例设计模式的使用
* @author 小桃子
*/
public class TestSingleton{
public static void main(String[] args){
//Singleton1 s1 = new Singleton1(); 不能直接创建对象
Singleton1 s1 = Singleton1.getInstance();
System.out.println(s1);
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s2);
System.out.println(s1 == s2);
}
}
// 懒汉式
class Singleton1{
// 私有的静态的引用类型变量
private static Singleton1 s;
// 私有的构造器
private Singleton1(){
}
// 公共的静态的可返回该类的实例
public static Singleton1 getInstance(){
if(s == null){
s = new Singleton1();
}
return s;
}
}
如果想通过 new 直接创建 Singleton1 的对象,编译就会出错,如下图:
我们只能通过 getInstance() 方法获取对象实例,运行结果如下图:
我们可以从结果中看到,两个对象打印的地址完全相同。 第二种实现方式:饿汉式。
🤔 那什么叫饿汉式呢?
饿汉式就是立即加载,所谓立即加载就是使用该类的时候先将对象创建,不管以后会不会使用到该对象。
实现代码如下:👇
class Singleton2{
// 私有的静态的最终的的引用类型的对象
private static final Singleton2 S = new Singleton2();
// 私有构造器
private Singleton2(){
}
// 公共的静态的可返回该类的实例
public static Singleton2 getInstance(){
return S;
}
}
创建一个独立的类 Singleton2 ,声明一个私有的静态的最终的 Singleton2 类型的常量 S,初始化赋值 new Singleton2() ,在此已经将对象创建好了,因为声明的是常量,所以其值不能改变;提供一个私有的无参的构造方法,外部不能通过 new 创建对象;提供一个公共的静态的返回 Singleton2 实例对象的 getInstance() 方法。
在已创建的 TestSingleton.java 源文件中加入,代码如下:
/**
* 单例设计模式的使用
* @author 小桃子
*/
public class TestSingleton{
public static void main(String[] args){
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
System.out.println(s3 == s4);
}
}
// 饿汉式
class Singleton2{
// 私有的静态的最终的的引用类型的对象
private static final Singleton2 S = new Singleton2();
// 私有构造器
private Singleton2(){
}
// 公共的静态的可返回该类的实例
public static Singleton2 getInstance(){
return S;
}
}
运行结果如下图: