单例模式:饿汉式 vs 懒汉式
1、什么是单例模式?
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
2.如何实现?
饿汉式 vs 懒汉式
饿汉式:一上来就造好对象
懒汉式:不用不造
饿汉式:
步骤:①.私有化类的构造器:避免从外面造对象
②内部创建类的对象(要求静态的因为③是静态的->静态方法里面只能调静态的)
③提供公共的静态的方法,返回类的对象
详细如下:
class Bank{
//1.私有化类的构造器:避免从外面造对象
private Bank(){
}
//2.内部创建类的对象
//4.要求此对象也必须声明为静态的
private static Bank instance = new Bank();
//3.提供公共的静态的方法,返回类的对象
public static Bank getInstance(){
return instance;//静态方法中只能调用静态的
}
}
懒汉式
步骤:①私有化类的构造器
②声明当前静态类对象,没有初始化
③声明public、static的返回当前类对象的方法
详细如下:
/*
* 单例模式的懒汉式实现
*/
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(){
if(instance == null){
instance = new Order();
}
return instance;
}
}
3.懒汉式 和 饿汉式的优劣
饿汉式:
-
坏处:对象的加载时间过长。
-
好处:线程安全的
懒汉式:
-
好处:延迟对象的创建。
-
目前的写法坏处:线程不安全。
4.线程安全的懒汉式:
package com.atguigu.java1;
/**
* 使用同步机制将单例模式中的懒汉式改写为线程安全的
*/
public class BankTest {
}
class Bank{
private Bank(){
}
private static Bank instance = null;
// private static synchronized Bank getInstance(){//同步监视器:Bank.class
// if (instance == null){
// instance = new Bank();
// }
// return instance;
// }
private static Bank getInstance(){//同步监视器:Bank.class
//方法1:效率稍差
// synchronized (Bank.class) {
// if (instance == null){
// instance = new Bank();
// }
// return instance;
// }
//方式2:效率更高
if (instance ==null){
synchronized (Bank.class) {
if (instance == null){
instance = new Bank();
}
}
}
return instance;
}
}