软件设计与体系结构实验报告课程名称软件设计与体系结构课程编号0920116实验项目名称工厂模式,单例模式案例学号班级姓名专业学生所在学院指导教师实验室名称地点实验时间实验名称:工厂模式,单例模式模式案例实验目的:工厂单例模式(ObserverPattern)是设计模式中行为模式的一种,它解决了上述具有一对多依赖关系的对象的重用问题。此模式的参与者分为两大类,一类是被观察的目标,另一类是观察该目标的观察者们。正因为该模式是基于“一对多”的关系,所以该模式一般是应用于由一个目标对象和N个观察者对象组成(当然也可以扩展为有多个目标对象,但我们现在只讨论前者)的场合。当目标对象的状态发生改变或做出某种行为时,正在观察该目标对象的观察者们将自动地、连锁地作出相应的响应行为。通过本次实验了解观察者模式的原理。并能够运用观察者模式来进行编程。实验内容1UML类图工厂模式——手机工厂MobileMobileFactoryNokiaMotorolaMotorolaFatoryNokiaFactory工厂模式——电脑产品单例模式:2程序的源代码工厂模式——手机工厂publicinterfaceMobile{publicvoidcall();}publicinterfaceMobileFactory{publicMobileproduceMobile();}publicclassMotorolaimplementsMobile{publicvoidcall(){System.out.println(摩托罗拉手机);}}publicclassNokiaimplementsMobile{publicvoidcall(){System.out.println(诺基亚手机);}}publicclassMotorolaFactoryimplementsMobileFactory{publicMobileproduceMobile(){System.out.print(摩托罗拉工厂制造了);returnnewMotorola();}}publicclassNokiaFactoryimplementsMobileFactory{publicMobileproduceMobile(){System.out.print(诺基亚工厂制造了);returnnewNokia();}}publicclassClient{publicstaticvoidmain(Stringargv[]){MobileFactorymf;Mobilem;mf=newMotorolaFactory();m=mf.produceMobile();m.call();mf=newNokiaFactory();m=mf.produceMobile();m.call();}}工厂模式——电脑产品publicinterfaceCPU{publicStringgetCPU();}publicclassAMDimplementsCPU{publicStringgetCPU(){returnAthlonXP2008+;}}publicclassIntelimplementsCPU{publicStringgetCPU(){return奔腾43.2C;}}publicinterfaceHardDisk{publicStringgetSize();}publicclassMaxtorimplementsHardDisk{publicStringgetSize(){returnMaXLinePlusII200G;}}publicclassWestDigitimplementsHardDisk{publicStringgetSize(){returnWD2500JD250G;}}publicinterfaceMainBoard{publicvoidAttach(CPUcpu)throwsException;}publicclassMSI865PEimplementsMainBoard{publicvoidAttach(CPUcpu)throwsException{if(cpu.getClass().toString().endsWith(Intel)){System.out.println(MSI865PE);}else{thrownewException(主板MSI865PE只能配Intel的CPU);}}}publicclassMSIK7N2GimplementsMainBoard{publicvoidAttach(CPUcpu)throwsException{if(cpu.getClass().toString().endsWith(AMD)){System.out.println(MSIK7N2G);}else{thrownewException(主板MSIK7N2G只能配AMD的CPU);}}}publicabstractclassComputerFactory{CPUcpu;HardDiskhd;MainBoardmb;publicvoidshow(){try{System.out.println(this.getClass().getName().toString()+(生产的电脑配置));System.out.println(CPU:+cpu.getCPU());System.out.println(HardDisk:+hd.getSize());System.out.print(MainBoard:);mb.Attach(cpu);}catch(Exceptione){System.err.println(e.getMessage());}}}publicclassIBMextendsComputerFactory{IBM(){cpu=newIntel();hd=newWestDigit();mb=newMSI865PE();}}publicclassDellextendsComputerFactory{Dell(){cpu=newAMD();hd=newMaxtor();mb=newMSIK7N2G();}}publicclassClient{publicstaticvoidmain(Stringargv[]){IBMibm=newIBM();ibm.show();Delldell=newDell();dell.show();}}单例模式:packageSingleton;publicclassAgentMazeFactoryextendsMazeFactory{publicAgentMazeFactory(){System.out.println(aAgentMazeFactoryhasbeencreated);}}packageSingleton;publicclassEnchantedMazeFactoryextendsMazeFactory{publicEnchantedMazeFactory(){System.out.println(aEnchantedMazeFactoryhasbeencreated);}}packageSingleton;publicabstractclassMazeFactory{privatestaticMazeFactoryuniqueInstance=null;protectedMazeFactory(){};publicstaticMazeFactoryinstance(){if(uniqueInstance==null)returninstance(AgentMazeFactory);elsereturnuniqueInstance;}publicstaticMazeFactoryinstance(Strings){if(uniqueInstance==null){/*if(s.equals(AgentMazeFactory))uniqueInstance=newAgentMazeFactory();elseif(s.equals(EnchantedMazeFactory))uniqueInstance=newEnchantedMazeFactory();*/try{uniqueInstance=(MazeFactory)Class.forName(s).newInstance();}catch(InstantiationExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}else{System.out.println(onlyoneinstancecanbecreated);}returnuniqueInstance;}}packageSingleton;publicclassTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubMazeFactoryfactory=MazeFactory.instance(Singleton.AgentMazeFactory);factory=MazeFactory.instance(Singleton.EnchantedMazeFactory);}}3实验截图工厂模式——手机工厂工厂模式——电脑产品单例模式:对该模式的认识经过本次工厂模式和单例模式的实验,通过自己动手编代码,是自己理解工厂单例模式机制,并且知道工厂模式有适用性在下列情况下使用工厂方法模式:1.一个类不能预期它必须创建的对象的类2.一个类希望由其子类来指定它创建的对象优点1.通过消除应用特定的类的实例化,代码变得更灵活、更可复用2.代码只处理Product类的接口,能与任何支持该接口的ConcreteProduct类一起工作缺陷1.客户端可能只因实例化一个特定的ConcreteProduct而生成Creator类的子类。单例模式的适用性当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。优点对惟一实例的受控访问允许可变的实例数量。缺点一、开销二、可能的开发混淆三、对象生存期。经过本次实验课的练习,我明白了编代码也是一种技巧,而设计模式便是大家提炼出来的有技巧编代码。使我对软件设计与体系结构这门课有了浓厚的兴趣,相信在学习这门课的知识,会让我获益良多。扣分原因(有扣分时填写)扣分