-
简单方式:
package com.gara.singleton; import java.awt.event.MouseWheelEvent; /** * 单例模式一: * 简单的方式:在并发执行时可能存在多个实例 * @author Administrator * */ public class SingletonDemo1 { private static SingletonDemo1 INSTANCE; private SingletonDemo1() { } public static SingletonDemo1 getInstance(){ if (INSTANCE == null) { INSTANCE = new SingletonDemo1(); } return INSTANCE; } }
-
公共域方式
package com.gara.singleton; /** * 单例模式2: * 公共域方式:返回时无法进行逻辑处理 * @author Administrator * */ public class SingletonDemo2 { public static final SingletonDemo2 INSTANCE = new SingletonDemo2(); private SingletonDemo2(){ } }
-
工厂化方式
package com.gara.singleton; /** * 单例模式3: * 工厂化方式:可以在实例过程中添加逻辑 * @author Administrator * */ public class SingletonDemo3 { public static final SingletonDemo3 INSTANCE = new SingletonDemo3(); private SingletonDemo3(){ } public static SingletonDemo3 getInstance(){ return INSTANCE; } }
-
枚举类方式
package com.gara.singleton; /** * 单例模式4: * 枚举类方式: * 优点: 1.简洁优化 * 2.不存在多个实例的问题 * 3.不存在反序列化的问题 * @author Administrator * */ public enum SingletonDemo4 { INSTANCE; public static void sayHello(String name){ System.out.println("hello "+name); } }
- 静态内部类方式
/**
* 懒汉试(静态内部类)
* 优点:结局性能问题和安全问题
* 极简模式下的最经典代码设计
*/
public class SingletonDemo5 {
/**
* 1.申明一个静态内部类
* private :私有化保证不被修改
* static : 保证全局唯一
* final : 防止内部操作
*/
private static class LazyHolder {
private static final SingletonDemo5 INSTANCE = new SingletonDemo5();
}
// 2. 构造方法私有化
// 如果不私有化,会有一个模式的无参构造,就意味着代码随时可以new出来!!!
private SingletonDemo5() {
}
/**
* 3. 提供静态方法获取实例
* final: 确保别人不能覆盖
*/
public static final SingletonDemo5 getInstance() {
return LazyHolder.INSTANCE;
}
}
- 测试
package com.gara.singleton; public class SingletonTest { public static void main(String[] args) { System.out.println("SingletonDemo1:"+SingletonDemo1.getInstance()); System.out.println("SingletonDemo1:"+SingletonDemo1.getInstance()); System.out.println("SingletonDemo2:"+SingletonDemo2.INSTANCE); System.out.println("SingletonDemo2:"+SingletonDemo2.INSTANCE); System.out.println("SingletonDemo3:"+SingletonDemo3.getInstance()); System.out.println("SingletonDemo3:"+SingletonDemo3.getInstance()); System.out.println("SingletonDemo4:"+SingletonDemo4.INSTANCE); System.out.println("SingletonDemo4:"+SingletonDemo4.INSTANCE);
System.out.println("SingletonDemo3:"+SingletonDemo5.getInstance());
System.out.println("SingletonDemo3:"+SingletonDemo5.getInstance());
SingletonDemo4.INSTANCE.sayHello("LiuLiu"); } }
输出结果:
SingletonDemo1:com.gara.singleton.SingletonDemo1@139a55
SingletonDemo1:com.gara.singleton.SingletonDemo1@139a55
SingletonDemo2:com.gara.singleton.SingletonDemo2@1db9742
SingletonDemo2:com.gara.singleton.SingletonDemo2@1db9742
SingletonDemo3:com.gara.singleton.SingletonDemo3@106d69c
SingletonDemo3:com.gara.singleton.SingletonDemo3@106d69c
SingletonDemo4:INSTANCE
SingletonDemo4:INSTANCE
SingletonDemo3:com.gara.singleton.SingletonDemo3@eed1f14
SingletonDemo3:com.gara.singleton.SingletonDemo3@eed1f14
hello LiuLiu