什么是单例设计模式?
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
好处:
提升运行效率,实现数据共享号(数据共享例如Application对象,生命周期服务器从开到关)
具体实现:
需要:
(1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
(2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。
(3)定义一个静态方法返回这个唯一对象。
1、懒汉式
对象只有被调用时才去创建
SingleTon类
/**
* @Auther:jiaxuan
* @Date: 2019/4/7 0007 20:57
* @Description:
*/
public class SingleTon {
/**
* 由于对象需要被静态方法调用,把SingleTon对象设置为static,因为是静态的所以要设置访问权限为private
* 如果不设置private而是public的话可直接调用对象,不用执行访问入口
*/
private static SingleTon singleTon;
/**
* 有构造器才能new对象,方法名与类名相同,无返回值因为确认肯定返回自身引用类型
* 但是一用private修饰,其他类就不能实例化这个类对象,必须对外实现访问入口
*/
private SingleTon(){}
/**
* 实例方法必须通过对象调用,现在对象不能new去创建,所以取不到实例方法
* 设置方法为静态方法
* 访问入口
* @return
*/
public static SingleTon getInstance(){
//如果实例化过,直接返回
if (singleTon==null){
//多线程访问下可能出现if同时成立的情况,添加锁
synchronized (SingleTon.class){
if (singleTon==null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
测试类
/**
* @Auther:jiaxuan
* @Date: 2019/4/7 0007 20:59
* @Description:
*/
public class Test {
public static void main(String[] args){
SingleTon singleTon = SingleTon.getInstance();
SingleTon singleTon1 = SingleTon.getInstance();
System.out.println(singleTon==singleTon1);
}
}
结果为true 代表singleTon和singleTon1是一个对象。
2、饿汉式
解决懒汉式中多线程访问可能出现同一个对象与效率低的问题
/**
* @Auther:jiaxuan
* @Date: 2019/4/7 0007 20:57
* @Description:
*/
public class SingleTon {
/**
* 在类加载时候进行实例化
*/
private static SingleTon singleTon = new SingleTon();
private SingleTon(){}
public static SingleTon getInstance(){
return singleTon;
}
}
test同上
结果为true