【JAVA】三 【设计模式】一 JAVA 单例 枚举
2016-05-18 01:48
549 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maguochao_Mark/article/details/51423725
【JAVA】三 【设计模式】一 JAVA 单例 枚举
单例特点
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
懒汉
线程不安全
伪单例 可通过Java反射得到多个对象
public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public static void main(String[] args) { try { Class cls = Single.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
懒汉
线程安全 synchronized 实现效率低
伪单例 可通过Java反射得到多个对象
package com.cn.mark.designmode; import java.lang.reflect.Constructor; public class Single { private static Single instance; private Single() { } public static synchronized Single getInstance() { if (instance == null) { instance = new Single(); } return instance; } public static void main(String[] args) { try { Class cls = Single.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
饿汉
线程安全 instance在类装载时就实例化
伪单例 可通过Java反射得到多个对象
package com.cn.mark.designmode; import java.lang.reflect.Constructor; public class Single { private static Single instance = new Single(); private Single() { } public static Single getInstance() { return instance; } public static void main(String[] args) { try { Class cls = Single.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
饿汉
线程安全 static 代码块 实例化instance
伪单例 可通过Java反射得到多个对象
package com.cn.mark.designmode; import java.lang.reflect.Constructor; public class Single { private static Single instance = null; static { instance = new Single(); } private Single() { } public static Single getInstance() { return instance; } public static void main(String[] args) { try { Class cls = Single.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
静态内部类
线程安全 SingleHolder 类加载是实例化 instance
伪单例 可通过Java反射得到多个对象
Single类被装载了,instance不一定被初始化。因为SingleHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingleHolder类,从而实例化instance。
package com.cn.mark.designmode; import java.lang.reflect.Constructor; public class Single { private static class SingleHolder { private static final Single INSTANCE = new Single(); } private Single() { } public static final Single getInstance() { return SingleHolder.INSTANCE; } public static void main(String[] args) { try { Class cls = Single.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
DCL 双重校验锁
线程安全
伪单例 可通过Java反射得到多个对象
package com.cn.mark.designmode; import java.lang.reflect.Constructor; /** * Singleton pattern example with Double checked Locking */ public class DoubleCheckedLockingSingleton { private volatile DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton() { } public DoubleCheckedLockingSingleton getInstance() { if (INSTANCE == null) { synchronized (DoubleCheckedLockingSingleton.class) { // double checking Singleton instance if (INSTANCE == null) { INSTANCE = new DoubleCheckedLockingSingleton(); } } } return INSTANCE; } public static void main(String[] args) { try { Class cls = DoubleCheckedLockingSingleton.class; Constructor con = cls.getDeclaredConstructor(null); con.setAccessible(true); Object first = con.newInstance(null); Object second = con.newInstance(null); System.out.println(first); System.out.println(second); } catch (Exception e) { e.printStackTrace(); } } }
枚举
线程安全 thread-safe
单例
package com.cn.mark.designmode; public enum SingleEnum { INSTANCE { @Override protected void whateverMethod() { System.out.println("whateverMethod"); } }; protected abstract void whateverMethod(); }
static instance
abstract class
Enum类源码片断
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
overwrite object readObject
Enum类源码片断
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { throw new InvalidObjectException("can't deserialize enum"); }
相关文章推荐
- JAVA之Myeclipse中Junit、静态导入、枚举和单例设计模式
- Java基础 - 类的加载,类加载器,反射,动态代理,模板设计模式,JDK5新特性,枚举(类),JDK1.7新特性
- Java高新技术之银行业务调度系统(java单例设计模式、java枚举)
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法
- 黑马程序员--张孝祥Java高新技术-JDK1.5新特性(二)【基本数据类型的自动拆箱与装箱,枚举】以及享元设计模式
- JAVA中Junit、静态导入、枚举和单例设计模式
- Java高新技术1---增强for循环 ---装箱与拆箱享元设计模式--自己写枚举--可变长度的参数
- Java高新技术1---增强for循环 ---装箱与拆箱享元设计模式--自己写枚举--可变长度的参数
- Java高新技术:享元设计模式及枚举
- java 设计模式-结构模式之合成模式
- java设计模式---三种工厂模式
- java设计模式之桥梁模式(Bridge)
- JAVA设计模式之二抽象工厂
- Java设计模式透析--策略模式(一)
- JAVA设计模式四策略模式
- Java设计模式之——面向对象六大原则
- Java设计模式之单例模式
- Java设计模式之单例(Singleton)模式
- Java设计模式——观察者模式