《(1.10)--第5.5章-单件模式软件设计与体系结构.ppt》由会员分享,可在线阅读,更多相关《(1.10)--第5.5章-单件模式软件设计与体系结构.ppt(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5.5章 单件模式1单件模式用来创建只能有一个实例的对象有一些对象在一个系统中只需要一个线程池对象、网络连接池对象、注册表设置对象、日志对象、这些对象可以通过全局变量、程序员之间的约定做到全局变量:在程序开始时创建对象资源浪费单件模式:确保只有一个实例会被创建第5.5章 单件模式2new MyObject();public MyClass private MyClass()public MyClass public static MyClass getInstance()public MyClass private MyClass()public static MyClass getInst
2、ance()return new MyClass();创建对象(多次)创建对象(多次)合法的定义,但是含有私有的构造函数的类合法的定义,但是含有私有的构造函数的类不能被实例化不能被实例化使用类名调用静态方法:使用类名调用静态方法:MyClass.getInstance()使用类名调用静态方法得到使用类名调用静态方法得到MyClass的的一个一个实例:实例:MyClass.getInstance()第5.5章 单件模式3经典的单件模式的实现public class Singleton private static Singleton uniqueInstance;/其它变量及方法其它变量及方法
3、private Singleton()public static Singleton getInstance()if(null=uniqueInstance)uniqueInstance=new Singleton();return uniqueInstance;第5.5章 单件模式4经典的单件模式的实现第5.5章 单件模式5利用单件模式创造的类,在任何时刻都只有一个对象利用单件对象,可以确保程序中使用的全局资源只有一份(系统设置对象、数据库连接对象)实现方式:私有的构造函数实例是在getInstance()方法被调用时创建的(也可能是以前早就被创建出来的)延迟实例化6牛奶巧克力工厂第5.5章
4、 单件模式7使用单件模式设计牛奶巧克力工厂public class ChocolateBoiler private boolean empty;private boolean boiled;private static ChocolateBoiler uniqueInstance;private ChocolateBoiler()empty=true;boiled=false;public static ChocolateBoiler getInstance()if(null=uniqueInstance)uniqueInstance=new ChocolateBoiler();return
5、uniqueInstance;public void fill()if(isEmpty()empty=false;boiled=false;第5.5章 单件模式8单件模式定义单件模式确保一个类只有一个实例,并提供一个全局访问点把某个类设计成自己管理的一个单独实例,同时避免其他类再自行产生实例提供对这个实例的全局访问点:需要实例时向类查询,它返回单个实例第5.5章 单件模式9多线程环境下的牛奶巧克力工厂 Thread1/Thread2 ChocolateBoiler boiler=ChocolateBoiler.getInstatnce()Thread1public static Chocola
6、teBoiler getInstance()if(null=uniqueInstance)uniqueInstance=new ChocolateBoiler();return uniqueInstance;Thread2public static ChocolateBoiler getInstance()if(null=uniqueInstance)uniqueInstance=new ChocolateBoiler();return uniqueInstance;Obj1Obj2第5.5章 单件模式10处理多线程方式A把getInstatnce()变成同步(synchronized)方法使
7、用同步方法可能导致程序性能使用同步方法可能导致程序性能的大幅下降的大幅下降第5.5章 单件模式11处理多线程方式B使用“急切”而非“延迟”的方法创建实例在该方法中在该方法中JVMJVM在加载这个类时马上创建此唯一的单件实例在加载这个类时马上创建此唯一的单件实例适用于如果应用程序需要频繁创建并使用单件实例,或者在创适用于如果应用程序需要频繁创建并使用单件实例,或者在创建和运行方面的负担并不繁重建和运行方面的负担并不繁重第5.5章 单件模式12处理多线程方式C使用“双重检查加锁”,在getInstatnce()中减少使用同步VolatileVolatile修饰的成员变量在每次被线程访问时,修饰的成
8、员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值都强迫从共享内存中重读该成员变量的值只有实例不存在时才进入同步区只有实例不存在时才进入同步区第5.5章 单件模式13问题是否可以创建一个类,所有的方法和变量定义为静态,把类直接当做一个单件?在使用单件类时,如果有许多类涉及其中,其初始化中在使用单件类时,如果有许多类涉及其中,其初始化中包含复杂的顺序,单件类极容易引起包含复杂的顺序,单件类极容易引起bugbug;除非有很大的;除非有很大的必要,应该选择对象的单件,而非类的单件必要,应该选择对象的单件,而非类的单件是否可以把单件类当成超类,设计出子类?继承单件类的问题一方面由于构造函数
9、是私有的,无法继承单件类的问题一方面由于构造函数是私有的,无法使用构造函数来扩展类;另一方面是由于单件的实现利使用构造函数来扩展类;另一方面是由于单件的实现利用了静态变量,这会导致所有派生类共享一个实例变量用了静态变量,这会导致所有派生类共享一个实例变量全局变量比单件模式差在哪里?全局变量可以提供全局访问,但是不能确保只有一个实全局变量可以提供全局访问,但是不能确保只有一个实例例第5.5章 单件模式14小结单件模式确保程序中一个类最多只有一个实例单件模式也提供访问这个实例的全局点实现单件模式需要私有的构造函数、一个静态方法、一个静态变量多线程环境下单件模式的实现具有不同的方式,各种方式各有优缺点