单列设计模式: 所谓的单列设计模式,就是采取一定的方法,保证整数软件系统中,只能存在一个对象实例。
特点:
1. 单例类只能有一个实例
2.单例列必须自己创建自己的唯一实例
3.单例类必须给所有其他对象提供这一实例
饿汉式单例模式
// 如何实现?:
public static void main(String[] args) {
// 返回的就是bank1 对象 (返回两个唯一的对象)
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank1 == bank2); // 返回true(地址值是一样的);
// Bank instance = Bank.getInstance();
}
}
// 银行类: 单例 (饿汉式单例模式)
class Bank {
// 1. 私有化类 的构造器,为了避免,除Bank类的外面调用构造器,(即实例化对象)
private Bank(){
}
// 2.内部 创建类的对象 (外面除了,Bank类以外实例化不了对象,只能在内部)
// 要求此对象,也必须声明为静态的
private static Bank instance = new Bank(); // (静态的)
// 3,提供公共的静态方法,返回类的对象,静态的方法中只能调用静态的结构
// 如果这里不是静态方法,是一般方法,外部类中的得创建Bank类的实例化对象,这样就可以调用getInstance方法,返回一个对象
public static Bank getInstance(){ //(静态的)
return instance;
}
}
懒汉式单例模式:
public class SingletonTest2 {
public static void main(String[] args) {
//类名(要实例化的是哪个对象) 变量名(用来接收实例化对象)
Order order1 = Order.getInstance();
Order order2 = Order.getInstance();
System.out.println(order1 == order2);// true
}
}
class Order {
//1.私有化类的构造器
private Order(){
}
// 2. 先声明当前类的对象,没有初始化
// 4. 此对象也必须声明为static的
private static Order instance = null;
// 3. 声明public、static的返回当前类对象的方法
public static Order getInstance(){
// 错误写法:
// instance = new Order();
// return instance;
// 不加if 判断,每调用一下getInstance,就创建一个新的Order实例化对象
if(instance == null){ // 如果没有实例化对象,就创建
instance = new Order();
}
return instance;
}
}
【区分】
饿汉式:
坏处: 对象加载时间过长
好处: 线程安全的(不会存在多个线程抢一个资源之类的)
懒汉式: 好处: 延迟对象创建
坏处: 不安全
例子: 两个线程都去获取这个对象,首次调用为null(判断),线程就假设阻塞了一下 ,就在这个阻塞的时间之内,另外一个线程也去获取这个对象,此时判断还是null,等阻塞没有了,他们两个对象 就进入if里面的new,各自实例化了一个实例对象,这样不安全,比如出现多个人抢到了一张火车票。
【应用场景】
网页的计数器,应用程序的日志应用,数据库的连接池,项目中读取配置文件的类,
任务管理器,回收站也是。