单例模式:保证再程序运行过程中,该类只有一个实例对象
实现单例的方式有八种,我们只需要掌握其中几个即可,下面我将用饿汉式,内部静态类,枚举三种方式来讲解单例
饿汉式和内部类
package com.iflytek.patten.singleton;
/**
* 单例模式: 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在
* 场景: dateSource 一般都是单例 设计的目的是避免了每次的新建和销毁的资源浪费
* @author zhangh
* @date 2018年11月16日上午9:38:06
*/
public class Singleton {
/**
* 静态常类
*/
private static Singleton Instance = new Singleton();
/**
* 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,
* 只有通过该类提供的静态方法来得到该类的唯一实例
*/
private Singleton(){}
/**
* 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,
* 如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用
* @author zhangh
* @date 2018年11月16日上午9:41:30
* @return
*/
public static Singleton getInstance(){
return Instance;
}
/**
* 以上是饿汉式单例写法:
* 优点:线程安全,类加载的时候就完成初始化
* 缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,
* 则会造成内存的浪费
*/
/******************************************静态内部类****************************************************/
//private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance1() {
return SingletonInstance.INSTANCE;
}
/**
* 类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,
* 别的线程是无法进入的
* 优点:避免了线程不安全,延迟加载,效率高。
*/
/******************************************静态内部类**************************************************/
}
枚举类
package com.iflytek.patten.singleton;
/**
* 通过枚举类来设计单例模式
* @author zhangh
* @date 2018年11月16日上午9:38:06
*/
public enum SingletonEnum {
INSTANCE;
}
调用方式: SingletonEnum .INSTANCE