ImageVerifierCode 换一换
格式:PPT , 页数:22 ,大小:61KB ,
文档编号:4775557      下载积分:22 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-4775557.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(单例模式课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

单例模式课件.ppt

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 /*类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,而且只有被调用到才会装载

8、,从而实现了延迟加载*/private static class SingletonHolder public static Singleton instance=new Singleton();/静态初始化器,由JVM来保证线程安全 public static Singleton getInstance()return SingletonHolder.instance;-15holder class模式n什么是类级内部类?简单点说,类级内部类指的是:有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。n类级内部类相当于其外部类的static成分,它的对

9、象与外部类对象间不存在依赖关系,因此可直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。n类级内部类中,可以定义静态的方法,在静态方法中只能够引用外部类中的静态成员方法或者成员变量。类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。-16holder class模式n在某些情况中,JVM已经隐含地为您执行了同步,这些情况下就不用自己再来进行同步控制了。这些情况包括:n由静态初始化器(在静态字段上或 static 块中的初始化器)初始化数据时 n访问 final 字段时n要想很简单的实现线程安全,可以采用静态初始化器的方式,它可以由JVM来保证线程安全性。比如前面的“饿

10、汉式”实现方式,但是这样一来,不是会浪费一定的空间吗?因为这种实现方式,会在类装载的时候就初始化对象,不管你需不需要。-17holder class模式的思路n如果现在有一种方法能够让类装载的时候不去初始化对象,那不就解决问题了?一种可行的方式就是采用类级内部类,在这个类级内部类里面去创建对象实例,这样一来,只要不使用到这个类级内部类,那就不会创建对象实例。从而同时实现延迟加载和线程安全。-18holder class模式的思路n当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类

11、在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会被虚拟机在装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。n这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。-19Enum singletonn/*使用枚举来实现单例模式的示例*/public enum SingletonC /*定义一个枚举的元素,它就代表了Singleton的一个实例 */uniqueInstance;/*示意方法,单例可以有自己的操作 */public void singletonOper

12、ation()/功能处理 -20单例模式示例1单件类(Singleton):Moon.java public class Moon private static Moon uniqueMoon;double radius;double distanceToEarth;private Moon()uniqueMoon=this;radius=1738;distanceToEarth=363300;public static synchronized Moon getMoon()if(uniqueMoon=null)uniqueMoon=new Moon();return uniqueMoon;p

13、ublic String show()String s=月亮的半径是+radius+km,距地球是+distanceToEarth+km;return s;-21单例模式示例应用 Application.javaimport javax.swing.*;import java.awt.*;public class Application public static void main(String args)MyFrame f1=new MyFrame(张三看月亮);MyFrame f2=new MyFrame(李四看月亮);f1.setBounds(10,10,360,150);f2.set

14、Bounds(370,10,360,150);f1.validate();f2.validate();class MyFrame extends JFrame String str;MyFrame(String title)setTitle(title);Moon moon=Moon.getMoon();str=moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();public void paint(Graphics g)super.paint(g);g.setFont(new Font(宋体,Font.BOLD,14);g.drawString(str,5,100);-22单例模式的练习n一个随机数产生的例子n在整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。n参与者:Singleton定义一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作,负责创建自己的唯一实例。n协作关系:客户只能通过Singleton的Instance操作访问一个Singleton的实例。

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|