1.单例模式-UML类图
1.1UML类图
1.2单例模式特点:
构造函数私有化
定义静态方法返回当前对象
确保有且只有一个对象
确保在序列化和反序列化操作的过程当中保证是同一个对象
1.3 Java基础 序列化和反序列化
什么是序列化和反序列化?
序列化:将一个对象转为字节序列过程称之为序列化
反序列化:将字节序列转为对象过程称之为反序列化
importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInput;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;/*** Created by Xionghu at 2017/5/23 13:57* function:* version:*/public classTest {public static voidmain(String[] args) {serializableOrderBean(newOrderBean("121","手机","545"));OrderBean orderBean =deserializeOrderBean();System.out.println(orderBean.toString());}/*** 序列化订单对象*@paramorderBean*/public static voidserializableOrderBean(OrderBeanorderBean){ObjectOutputStream outputStream =null;try{outputStream =newObjectOutputStream(newFileOutputStream(newFile("C:\\Users\\xionghu\\Desktop\\"+OrderBean.class.getSimpleName()+".txt")));outputStream.writeObject(orderBean);}catch(Exception e) {e.printStackTrace();}finally{if(outputStream!=null){try{outputStream.close();}catch(Exception e) {e.printStackTrace();}}}}public staticOrderBeandeserializeOrderBean(){ObjectInputStream objectInputStream =null;try{objectInputStream =newObjectInputStream(newFileInputStream(newFile("C:\\Users\\xionghu\\Desktop\\"+OrderBean.class.getSimpleName()+".txt")));Object readObject = objectInputStream.readObject();return(OrderBean) readObject;}catch(Exception e) {e.printStackTrace();}return null;}}复制代码
1.4 扩展序列化
2.单例模式—解决方案 2.1 懒汉式 --- 当你使用的时候我就创建单例对象 优势:性能高 补充:加了同步锁性能低 缺点:耗内存 (存在隐患---并发)
package com.kpioneer.arctirect.singleton.lazy;/** * 懒汉式 * Created by Xionghu at 2017/5/31 14:44 * function: 当程序第一次访问单件模式实例时才进行创建。 * version: */public class Singleton { private static Singleton instance; private Singleton() { } //在服务器,或者多线程访问 public static synchronized Singleton getInstance() { //假设: 3个线程 -- 并发线程 //场景: 同时调用getInstance方法 //线程-: if (instance == null) { instance = new Singleton(); } return instance; }}复制代码
2.2 饿汉式 --- 我不管你用不用我都提前准备好 优势:省内存 (安全) 缺点:耗内存 (静态变量生命周期的缘故)
package com.kpioneer.arctirect.singleton.hungry;/** * 饿汉式在 * Created by Xionghu at 2017/5/31 14:44 * function: 程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。 * version: */public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }复制代码
2.3 双重判断
package com.kpioneer.arctirect.singleton;/** * 双重选择 * Created by Xionghu at 2017/5/31 14:44 * function: * version: */public class Singleton { //线程并发的时候,当我们的变量被修改之后,其它的并发线程及时收到通知,其它的线程就可以访问数据 //volatile--会屏蔽虚拟机优化过程 private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; }}复制代码
2.4 枚举实现单例模式
2.5 静态内部类
2.6 容器管理单例对象 例如:java服务连接池(数据库连接池)、Spring IOC
3 单例模式具体应用 第三方 ImageLoader(通过源码分析,得到单例模式中双重检测方案) LayoutInflater 单例模式通过容器进行管理 LayoutInflater 源码分析 WindowManager、ActivityManager、PowerManager都是容器管理