所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对 某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构 造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生 类的对象了,但在类内部仍可以产生该类的对象。
因为在类的外部开始还无 法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象 的变量也必须定义成静态的。
单例模式的优点:
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的 产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可 以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方 式来解决。
单例模式的饿汉式实现:
package com.hao.zhi.lv.SingletonTest1;
/**
*单例模式的饿汉式实现
*
*/
public class Bank1 {
//1.定义私有化的构造器
private Bank1(){
};
//2.内部创建类的的对象 ,要求此对象也必须声明为静态的
private static Bank1 instance=new Bank1();
//3.提供公共的静态的方法,返回类的对象
public static Bank1 getInstance() {
return instance;
}
}
单例模式的懒汉式实现:
package com.hao.zhi.lv.SingletonTest2;
/**
*
* 单例模式的懒汉式实现
*/
public class Bank2 {
//1、定义一个私有化实例
private Bank2(){
}
//2、声明一个对象,要求此对象也必须声明为静态的
private static Bank2 instance=null;
//3.声明public、static的返回当前类对象的方法
public static Bank2 getInstance(){
if (instance==null){
instance=new Bank2();
}
return instance;
}
}
单例模式的懒汉式实现存在线程安全问题。
解决线程安全方式1:
package com.hao.zhi.lv.SingletonTest2;
/**
*
* 单例模式的懒汉式实现
*/
public class Bank2 {
//1、定义一个私有化实例
private Bank2(){
}
//2、声明一个对象,要求此对象也必须声明为静态的
private static Bank2 instance=null;
//3.声明public、static的返回当前类对象的方法
public synchronized static Bank2 getInstance(){
if (instance==null){
instance=new Bank2();
}
return instance;
}
}
解决线程安全方式1:
package com.hao.zhi.lv.SingletonTest2;
/**
*
* 单例模式的懒汉式实现
*/
public class Bank2 {
//1、定义一个私有化实例
private Bank2(){
}
//2、声明一个对象,要求此对象也必须声明为静态的
private static Bank2 instance=null;
//3.声明public、static的返回当前类对象的方法
public static Bank2 getInstance() {
if (instance==null){
synchronized(Bank2 .class){
if (instance==null){
instance=new Bank2 ();
}
}
}
return instance;
}
}
参考来自尚硅谷