




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Singleton(单例)唯一的对象实例,定义,通常程序在运行时,会产生许多对象实例,如java.lang.String类的对象实例 如何控制用户使用new对一个类的实例构造器的任意调用,提供一种机制来保证一个类只有一个实例? 有没有更通用的方法Singleton Pattern,定义,对象应该在程序启动时被创建,并且在结束时被删除,如应用程序的基础高层对象 通过这个对象可以得到系统中其他的对象 工厂对象(Factories),用来创建其他对象; 管理器对象(managers),负责控管其他对象; 全局注册表(Registry)。 类似这种类型的对象不该被创造出多份,定义,保证一个类仅有一个实例,并提供一个访问它的全局访问点,又叫单态模式或者单件模式 类的对象的产生是由类的构造函数完成的,如果想限制对象的产生,可以将构造函数变为私有的(至少是受保护的) 提供一个自己的对象以及访问这个对象的静态方法,定义,Singleton: 单例 提供一个instance方法,让客户可以使用它的唯一实例,定义,定义,单例类中可以存在一些标识当前状态的属性,这个时候单例类就是有状态的 反之,就是无状态的单例类。有状态的单例类常常用来当作状态库使用。 例如,论坛中的帖子计数器,每次浏览一次需要计数,单态类能保持住这个计数,并且能synchronize的安全自动加1,,程序示例,饿汉式 懒汉式,懒汉式,public class Singleton private static Singleton singleton=null; private Singleton() public static synchronized Singleton getInstance() if(singleton=null) singleton=new Singleton(); System.out.println(“已产生对象”); return instance; ,懒汉式,构造方法是私有的外面不可能创建Singleton实例 从内部创建 需要一个方法来创建此实例方法必须是static的 需要一个属性存储对象static的 确保只生成一个实例做判断,懒汉式,线程问题 假设有两个线程,thread1,thread2 thread1运行到第5行 thread2也运行到第5行之后 此时两线程都得到single为空 那么就会有两个实例了 解决办法同步,饿汉式,public class Singleton private static Singleton singleton=new Singleton; private Singleton() System.out.println(“已产生对象”); public static Singleton getInstance() return singleton; ,饿汉式,public class Main public static void main(String args) System.out.println(“开始”); Singleton obj1=Singleton.getInstance(); Singleton obj2=Singleton.getInstance(); if(obj1=obj2) System.out.println(“相同”); else System.out.println(“不同”); System.out.println(“结束”); ,饿汉式,因为static类型的属性,只在类加载时初始化一次,以后不会再初始化了,确保了只有一个实例,说明,构造函数是私有的,断开了使用构造函数得到类的实例的通道(但是类失去了多态性) 懒汉式进行了同步处理防止多线程环境中产生多个实例 懒汉式第一次引用时被实例化;饿汉式类加载时被实例化 饿汉式更符合Java语言特点,说明,单例模式在Java中的陷阱和假象 多个虚拟机:在使用了EJB,JINI,RMI等技术的分布式系统中,应避免使用存在状态的单例模式 多个类加载器:单例类在多加载器的环境下会产生多个单例对象(注:类加载器就是Java虚拟机中用来把类加载到内存的工具 ),说明,错误的同步处理 串行化(可序列化),仅仅添加“implements Serializable”不够,因为一个串行化的对象每次反串行化的时候,都会创建一个新的对象,内部类式单例类,public class SingleManager private SingleManager() System.out.println(“Singleton!“); static class SingletonHolder private static SingleManager instance = new SingleManager(); public static SingleManager getInstance() return SingletonHolder.instance; public static void main(String args) SingleManager.getInstance(); ,结合Factory和Singleton,public class UtilServiceSingletonFactory private static UtilServiceSingletonFactory instance; protected UtilServiceSingletonFactory() public synchronized static UtilServiceSingletonFactory getInstance() if (instance = null) instance = new UtilServiceSingletonFactory(); return instance; public UtilService make() return new ConcreteUtil(); ,结合Factory和Singleton,客户端 UtilService utilService = UtilServiceSingletonFactory.getInstance().make(); 工厂对象实例数不超过1个 Factory Method的实现make方法 变换构造子修饰(private-protected),保留了Factory的派生性,单例注册表,BeanFactory public interface BeanFactory ,单例注册表,ListableBeanFactory public class ListableBeanFactory implements BeanFactory public ListableBeanFactory() System.out.println(“ListableBeanFactory Created“); ,单例注册表,XmlBeanFactor public class XmlBeanFactory implements BeanFactory public XmlBeanFactory() System.out.println(“XmlBeanFactory Created“); ,FactorySingletonRegistry import java.util.HashMap; import java.util.Map; public class FactorySingletonRegistry private static FactorySingletonRegistry instance; private static Map factoryMap = new HashMap(); private FactorySingletonRegistry() public synchronized static FactorySingletonRegistry getInstance() if (instance = null) instance = new FactorySingletonRegistry(); return instance; ,单例注册表,单例注册表,public synchronized BeanFactory getBeanFactory(String factoryClassName) BeanFactory factory = (BeanFactory)factoryMap.get(factoryClassName); if (factory != null) return factory; try factory = (BeanFactory)Class.forName(factoryClassName).newInstance(); catch (ClassNotFoundException e) System.out.println(“Couldnt find class “ + factoryClassName); catch (InstantiationException e) System.out.println(“Couldnt instantiate an object of type “ + factoryClassName); catch (IllegalAccessException e) System.out.println(“Couldnt access class “ + factoryClassName); factoryMap.put(factoryClassName, factory); return factory; ,单例注册表,客户端 public class FactorySingletonRegistryUsage public static void main(String args) /实例化工厂注册表 FactorySingletonRegistry registry = FactorySingletonRegistry.getInstance(); /通过反射机制,依据给定的工厂全名返回具体工厂实例 BeanFactory xmlBeanFactory1 = registry.getBeanFactory(“XmlBeanFactory“); BeanFactory listableBeanFactory1 = registry.getBeanFactory(“ListableBeanFactory“);,/第二次索取 BeanFactory xmlBeanFactory2 = registry.getBeanFactory(“XmlBeanFactory“); BeanFactory listableBeanFactory2 = registry.getBeanFactory(“ListableBeanFactory“); /比较先后两次索取的工厂实例 System.out.println(xmlBeanFactory1.hashCode() = xmlBeanFactory2.hashCode(); System.out.println(listableBeanFactory
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社会纠纷法律文书标准格式范文
- 中级会计职称考试全科复习资料套餐
- 中小学教师评价体系建设方案
- 外贸业务合同条款解析实例
- 执业药师之《西药学专业一》押题模拟及参考答案详解(巩固)
- 数学教学实习心得与调研报告
- 消防设备维保检验资质清单合集
- 工业自动化解决方案总结
- 高速公路收费站钢结构安装安全管理方案
- 农业生产风险管理与防范
- 中国邮政储蓄银行2025年反洗钱知识考试题库(带答案)
- 共情课件的教学课件
- 2025年医院三基三严试题题库(附答案)
- 医院消毒供应中心控感管理规范
- 2025年部编版语文新教材三年级上册第六单元大单元教学及课时教案
- 2025年湖北省中考化学试题深度解读及答案详解
- 贸易安全管理办法
- 疾控中心检验科个人实习总结
- 国企总经理竞聘面试题8套和专业题22问及答案
- 乡镇避孕药具知识培训
- 酒店室内装饰工程施工组织设计方案
评论
0/150
提交评论