您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > OOSA&D_07_2_设计模式介绍(单例模式)
【07_设计模式】策略模式2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright1面向对象系统分析与设计课程内容单例模式2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright2单例模式思考:是否有一些对象只能有一个实例?如果制造出多个实例,就会导致许多问题产生线程池程序的行为异常、资源使用过量、不一致…缓存对话框日志对象充当打印机、显卡等设备的驱动程序的对象……我们需要一种方法:确保一个类只有一个实例单例模式思考:是否有一些对象只能有一个实例?如果制造出多个实例,就会导致许多问题产生将对象赋值给一个全局变量程序的行为异常、资源使用过量、不一致…我们需要一种方法:确保一个类只有一个实例一开始就创建好对象,程序却一直没用,浪费并且并不能保证只有一个实例单例模式向锅内填入巧克力和牛奶将锅内的巧克力和牛奶煮沸倒出煮沸的巧克力和牛奶锅不是空的里面的东西未沸腾锅是空的锅不是空的里面的东西已沸腾2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright6如何来设计这个类呢?properties?methodbody?ChocolateBoilerfill()drain()boil()2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright7一种类图:ChocolateBoilerempty:booleanboiled:booleanfill():voiddrain():voidboil():voidisEmpty():booleanisBoiled():boolean向锅内填入巧克力和牛奶将锅内的巧克力和牛奶煮沸倒出煮沸的巧克力和牛奶锅不是空的里面的东西未沸腾锅是空的锅不是空的里面的东西已沸腾ChocolateBoilerempty:booleanboiled:booleanfill():voiddrain():voidboil():voidisEmpty():booleanisBoiled():booleanpublicclassChocolateBoiler{…pubicvoidfill(){if(isEmpty()){empty=false;boiled=false;}}pubicvoidboil(){if(!isEmpty()&&!isBoiled()){boiled=true;}}pubicvoiddrain(){if(!isEmpty()&&isBoiled()){empty=true;}}}问题:你能够在一个应用程序中只创建一个巧克力煮锅(ChocolateBoiler)类吗?2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright9模式动机如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright102020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright11单例模式(SingletonPatten)单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。SingletonstaticuniqueInstancepublicicgetInstance()privateSingleton()publicclassSingleton{privatestaticSingletonuniqueInstance;privateSingleton(){}publicstaticSingletongetInstance(){if(uniqueInstance==null){uniqueInstance=newSingleton();}returnuniqueInstance;}}静态变量记录唯一实例构造函数私有,只有自己内部才可以实例化如果uniqueInstance为空,表示还没有创建实例,否则反之用getInstance方法实例化,并返回这个实例类图:单例模式2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright13instanceif(instance==null)instance=newSingleton();returninstance;Singleton-instance:Singleton-+Singleton()getInstance()...:SingletonpublicclassChocolateBoiler{…pubicvoidfill(){if(isEmpty()){empty=false;boiled=false;}}pubicvoidboil(){if(!isEmpty()&&!isBoiled()){boiled=true;}}pubicvoiddrain(){if(!isEmpty()&&isBoiled()){empty=true;}}}privatestaticChocolateBoileruniqueInstance;privateChocolateBoiler(){…}publicstaticgetInstance(){if(uniqueInstance==null){uniqueInstance=newChocolateBoiler();}returnuniqueInstance;}单例模式的三个要点一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright15单例模式的实现代码2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright16publicclassSingleton{privatestaticSingletoninstance=null;//静态私有成员变量privateStringID;//私有构造函数privateSingleton(){}//静态公有工厂方法,返回唯一实例publicstaticSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}publicstaticStringgetID(){returnID;}}练习:身份证号码在现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将给居民分配一个身份证号码,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产生新的号码。现使用单例模式模拟该场景。2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright17身份证号码场景2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright18instanceIdentityCardNo--instanceno:IdentityCardNo:String-+-+IdentityCardNo()getInstance()setIdentityCardNo(Stringno)getIdentityCardNo()...:IdentityCardNo:void:String作业:打印池在操作系统中,打印池(PrintSpooler)是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变打印任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright19下课2020年1月19日星期日NeusoftComputerScienceandTechnologyDepartmentcopyright20学习愉快!
本文标题:OOSA&D_07_2_设计模式介绍(单例模式)
链接地址:https://www.777doc.com/doc-3159772 .html