单例模式:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
单例模式的两种形式:
饿汉模式:开始就创建该类的实例对象赋值给一个该类型的私有静态变量。(开始就进行类的实例化)
懒汉模式:先创建一个该类型的私有静态变量赋值为null,需要用到实例对象的时候再去创建,
然后将该对象实例赋值给该类型的变量。(什么时候用什么时候进行类的实例化)。
两种模式的优缺点:
饿汉式:
优点:天生是线程安全的。
缺点:在类加载的时候就进行了类的实例化,在内存中的存储时间过长。
懒汉式:
优点:对象在内存中的存储时间较短,需要用到对象时才进行实例化。
缺点:本身是线程不安全的,因此在多线程情况下还要将代码进行修改,使得变成线程安全的。
单例模式的要点有三个:
①是某个类只能有一个实例。
②是它必须自行创建这个实例。
③是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:
①单例模式的类只提供私有的构造函数。
②类定义中含有一个该类的静态私有对象作为属性。
③该类提供了一个公有的静态的函数用于创建或获取它本身的静态私有对象。
TODO--->如下的懒汉模式写法是线程不安全的,后面再来补全。
public class SingletonTest {
public static void main(String[] args) {
Bank bank = Bank.getInstance();
Bank instance = Bank.getInstance();
System.out.println(bank == instance);//true
Pig instance1 = Pig.getInstance();
Pig instance2 = Pig.getInstance();
System.out.println(instance1 == instance2);//true
}
}
//饿汉模式
class Bank {
//2.类定义中含有一个该类的静态私有对象作为属性。
private static Bank instance = new Bank();
//1.构造器私有化
private Bank() {
}
//3.该类提供了一个公有的静态的函数用于创建或获取它本身的静态私有对象。
public static Bank getInstance() {
return instance;
}
}
//懒汉式
class Pig {
//2.创建一个该类型的私有静态变量并赋值为null。
private static Pig instance = null;
//1.构造器私有化
private Pig() {
}
//3.该类提供了一个公有的静态的函数用于创建或获取它本身的静态私有对象。但是该类的实例化只能进行一次。
public static Pig getInstance() {
//4.进行类的实例化
if (instance == null) {
instance = new Pig();
}
return instance;
}
}
![](https://img-blog.csdnimg.cn/img_convert/47b12a897d844197b9a90942c6648e81.png)
![](https://img-blog.csdnimg.cn/img_convert/875e0a3b57f7447fbf0060d01b1a9f42.png)