package singletonPattern;
/**
* Title: Singleton1 Description:
* 饿汉式:直接创建实例,不管你是否需要这个对象
* (1)构造器私有化
* (2)自行创建实例,用静态变量来保存
* (3)向外提供这个实例
* (4)强调这是一个单例,可以用final来修饰
* @author zhangshuai
* @date 2019-06-16 17:45
**/
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1();
// 构造器私有化
private Singleton1() {
}
// 实例的方法
public void method() {
System.out.println("单例模式:饿汉式,调用单例的方法!");
}
}
package singletonPattern;
/**
* Title: Singleton2
* Description:
* @author zhangshuai
* @date 2019-06-16 17:53
**/
/**
* 枚举类型,标识该类型的对象是有限的几个, 我们可以限定为一个,就成了单例模式
*/
public enum Singleton2 {
INSTANCE;
// 实例的方法
public void method() {
System.out.println("枚举类型,调用单例的方法!");
}
}
package singletonPattern;
/**
* Title: Singleton3 Description:
*
* @author zhangshuai
* @date 2019-06-16 17:56
**/
// 懒汉式
public class Singleton3 {
// 静态变量保存这个单例,这里不能用public
private static Singleton3 instance;
// 构造器私有化
private Singleton3() {
}
//注意synchronized
public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
package singletonPattern;
/**
* Title: Singleton
* Description:
* @author zhangshuai
* @date 2019-06-16 18:43
**/
/**
* 在内部类被加载时,才创建INSTANCE实例对象。
* 静态内部类不会自动随着外部类的加载和初始化而初始化,它要单独加载和初始化。
* 因为是在内部类加载和初始化时创建的,因此是线程安全的。
*/
public class Singleton6 {
private Singleton6() {
}
// 静态内部类
private static class Inner {
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstance() {
return Inner.INSTANCE;
}
}