单例模式课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《单例模式课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模式 课件
- 资源描述:
-
1、-1第三讲单例模式-2场景梦想nSINGLETON俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道老公,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)-3单例(singleton)模式n单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。n单例模式的要点n(1)某个类只能有一个实例;n(2)它必须自行创建这个实例;n(3)它必须自行向整个系统提供这个实例。-4单例模式的关键特征n意图:希望类只有一个实例,但没有控制类实例化的全局变量(对象)。同时希望
2、确保所有客体对象使用该类的相同实例,而无需将引用传给它们。n问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。n解决方案:保证一个实例n参与者与协作者:客户对象只能通过getInstance()方法创建单例类的实例。n效果:客户对象无需操心是否存在单例类的实例,实例化有单例类自己控制。n实现:n一个引用单例对象的静态私有成员变量n一个公共静态方法,负责实现一次性的实例化并返回对单例对象的引用n设置为保护或私有的构造方法-5懒汉式 VS 饿汉式 n饿汉式:静态初始化方式,在启动加载单例类时就实例化对象,只实例化一次,以后用到的时候就不需要再去实例化了,加载类的
3、时候速度比较慢,但以后获得对象时的速度比较快,该对象从加载到应用结束一直占用资源。n懒汉式:相当于一个延迟加载机制,即你需要这个对象时候才去实例化,加载类的时候速度比较快,但以后获得对象时的速度比较慢,该对象在整个应用的生命周期只有一部分时间占用资源。面临多线程访问的安全性问题,需要做双重锁定处理才可以保证安全。n所以,到底使用哪一种方式,要看实际的需求-6单例(singleton)模式n模式的结构中只包括一个角色:n单件类(Singleton)-7饿汉式-8懒汉式-9单例模式示例饿汉式public class EagerSingleton/类初始化时,已经自行实例化 private stat
4、ic final EagerSingleton m_instance=new EagerSingleton();private EagerSingleton()/私有化构造器 public static EagerSingleton getInstance()return m_instance;-10单例模式示例懒汉式public class Singleton private static Singleton instance=null;private Singleton()public static Singleton getInstance()i f(instance=null)inst
5、ance=new Singleton();return instance;-11单例模式的问题n在多线程程序中,Singleton模式可能会出现一个问题。n假设对getInstance()方法的两个调用几乎同时发生,这种情况可能非常糟糕。此时会发生什么?n1.第一个线程检查实例是否存在。因为实例不存在,该线程执行创建第一个实例的代码部分。n2.然而,假设在实例化完成之前,另一个线程也来检查实例成员变量是否为null。因为第一个线程还什么都没有创建,实例成员变量仍然等于null,所以第二个线程也执行了创建一个对象的代码。n3.现在,两个线程都执行了Singleton对象的new操作,因此创建了两
6、个重复的对象。-12单例模式示例使用synchronizedpublic class Singletonprivate static Singleton instance=null;private Singleton()public static synchronized Singleton getInstance()if(instance=null)instance=new Singleton();return instance;-13单例模式示例双检锁 DCL(Double-checked locking)public class Singleton private static Sing
7、leton instance=null;private Singleton()public static Singleton getInstance()if(instance=null)/第一次检查synchronized(Singleton.class)/第二次检查if(instance=null)instance=new Singleton();return instance;-14单例模式示例-Class holder public class SingletonFactory /*类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,而且只有被调用到才会装载
展开阅读全文