单例模式
饿汉模式
先new 出对象
public class Singleton1{
private static final Singleton1 INSTANCE = new Singleton1();
private Singleton1(){
}
public static Singleton1 getIstance(){
return INSTANCE;
}
}
枚举饿汉
package com.situ.day25;
//枚举饿汉式
public enum Singleton4 {
//Singleton4 INSTANCE;
INSTANCE;
//枚举构造方法默认就是私有的,去掉也可以
private Singleton4() {
}
public static Singleton4 getInstance() {
return INSTANCE;
}
}
懒汉模式
public class Singleton2{
private static Singleton2 INTANCE;
private Singleton2()
{
}
public static Singleton2 getInstance(){
if(INSTANCE == null){
INSTANCE = new Singleton2();
}
return INSTANCE;
}
双重检查机制懒汉
package com.situ.day25;
//懒汉式
//从时间空间上看:以时间换空间
//从线程安全上看:不安全的(所以要加锁synchronized)
public class Singleton2 {
private static Singleton2 instance;
private Singleton2() {
}
public static Singleton3 getInstance() {
//只有第一次是null的时候才需要加锁,其他情况是不需要加锁
if (INSTANCE == null) {
synchronized (Singleton3.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton3();
}
}
}
return INSTANCE;
}
}
内部类懒汉
public class Singleton5(){
private Singleton5(){
}
private static class Holder{
static Singleton5 ISTANCE = new Singleton();
}
public static Singleton5 getInstance(){
return Holder.INSTANCE;
}
}
简单工厂
对修改封闭,对扩展开放
简单工厂的核心是选择而不是实现
抽象类、扩展类、简单工厂反射