一、所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例。
具体代码的实现:
1、饿汉模式(提前创建对象)
// 饿汉模式 class Bank{ //提供私有的构造器 private Bank(){ } //内部创建类的对象 //此对象也必须创建为静态的 private static Bank Instance = new Bank(); //提供公共的静态方法,返回类的对象 public static Bank getInstance(){ return Instance; } }
2.懒汉模式(延迟创建对象)
//懒汉模式
class Bank1{
//提供私有的构造器
private Bank1(){
}
//声明一个没有初始化的当前类对象
//此对象也必须创建为静态的
private static Bank1 Instance= null;
//创建一个返回当前类对象的公共静态方法
public static Bank1 getInstance(){
if (Instance == null){
Instance = new Bank1();
}
return Instance;
}
}
两种方式的对比:
* 饿汉式:
* 坏处:对象加载时间过长。
* 好处:饿汉式是线程安全的
*
* 懒汉式:好处:延迟对象的创建。
* 目前的写法坏处:线程不安全。--->到多线程内容时,再修改
创建方式上的相同与不同:
相同点:两者都需要创建私有的构造器,声明私有静态类的对象,创建返回当前类对象的公共静态方法
不同点:1、饿汉模式在声明私有静态类的对象时对对象进行实例化
//内部创建类的对象
//此对象也必须创建为静态的
private static Bank Instance = new Bank();
懒汉模式在声明私有静态类的对象时不进行实例化
//声明一个没有初始化的当前类对象
//此对象也必须创建为静态的
private static Bank1 Instance= null;
2、饿汉模式:调用公共的静态方法,返回类的对象
//提供公共的静态方法,返回类的对象
public static Bank getInstance(){
return Instance;
}
懒汉模式:调用公共的静态方法时需要判断对象名是否为空,若‘真’则对对象进行实例化,‘否’则返回已经创建过的对象。
//创建一个返回当前类对象的公共静态方法
public static Bank1 getInstance(){
if (Instance == null){
Instance = new Bank1();
}
return Instance;
}
使用同步机制将单例模式中的懒汉式改写为线程安全的。
方式一:每个线程进来时都需要等待前一个线程执行完毕才能进入判断,若已被实例化则之后的线程等待的时间是无意义的,增加了消耗时间。
方式二:在加入synchronized同步代码块之前先判断一遍对象是否实例化,若已被实例化则不需要等待获取锁,直接获取对象。减少消耗时间提高效率。
class Bank{
private Bank(){}
private static Bank instance = null;
public static Bank getInstance(){
//方式一:效率稍差
// synchronized (Bank.class) {
// if(instance == null){
//
// instance = new Bank();
// }
// return instance;
// }
//方式二:效率更高
if(instance == null){
synchronized (Bank.class) {
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}
}