1,饿汉式
优点:线程安全,调用效率高
package com.imust.gof.demo;
/**
* 测试饿汉式单例:特点:线程安全,(天然的线程安全模式)
* 设计模式
* 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
* 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享原模式,代理模式
* 行为型模式:模版方法模式,命令模式,迭代模式,观察器模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式
*
* @author Zhang.Zhi.Fei 2017年9月5日
*
*/
public class singletonDemo1 {
private static singletonDemo1 instance = new singletonDemo1();//类初始化时候立即加载
private singletonDemo1(){}
public static singletonDemo1 getInstance(){
return instance;
}
}
懒汉式:
优点,调用效率低,方法同步
package com.imust.gof.demo;
/**
*懒汉式 不初始化,延迟加载,真正用的时候才加载
* 设计模式
* 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
* 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享原模式,代理模式
* 行为型模式:模版方法模式,命令模式,迭代模式,观察器模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式
*
* @author Zhang.Zhi.Fei 2017年9月5日
*
*/
public class singletonDemo2 {
private static singletonDemo2 instance =null;//类初始化时候立即加载
private singletonDemo2(){}
//调用效率低,方法同步
public static synchronized singletonDemo2 getInstance(){
if(instance == null){
instance = new singletonDemo2();
}
return instance;
}
}
静态内部类实现单例模式
package com.imust.gof.demo;
/**
* 静态内部类实现方式(也是一种懒加载方式)
*
* -- 外部类没有static属性,则不会像饿汉式那样立即加载对象
* -- 只有真正调用getinstance(),才会加载静态内部类,加载类时是线程安全的。instance是static final
* 类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性
* -- 兼备了并发高效调用和延迟加载的优势
*
*
* @author Zhang.Zhi.Fei 2017年9月5日
*
*/
public class SingletonDemo04 {
private static class SingletonClassInstance{
private static final SingletonDemo04 instance = new SingletonDemo04();
}
public static SingletonDemo04 getInstance(){
return SingletonClassInstance.instance;
}
private SingletonDemo04(){}
}
枚举类实现单例模式
package com.imust.gof.demo;
/**
* 测试枚举实现单例模式 (没有懒加载,演示加载)
* @author Zhang.Zhi.Fei 2017年9月5日
*
*/
public enum SingletonDemo5 {
//这个枚举元素,本身就是单例
INSTANCE;
//添加自己需要的操作
public void SingletonOperation(){
}
}
以懒汉式单例为例子测试防止序列化破解单例
package com.imust.gof.demo;
import java.io.Serializable;
/**
* 测试懒汉式单例模式(如何防止反射和反序列化)
* @author Zhang.Zhi.Fei 2017年9月5日
*
*/
public class SingletonDemo6 implements Serializable{
private static SingletonDemo6 instance;
private SingletonDemo6(){
if(instance != null){
**//为了防止被反射破解
throw new RuntimeException();**
}
}
public static synchronized SingletonDemo6 getInstances(){
if(instance == null){
instance = new SingletonDemo6();
}
return instance;
}
}