1设计模式2本节主要内容Singleton模式Factory模式抽象工厂模式Prototype(原型)Builder模式Adapter示例Composite(组合)Proxy(代理)DecoratorBridgeObserver3Singleton模式应用场景模式形式一publicclassSingleton{privateSingleton(){}privatestaticSingletoninstance=newSingleton();publicstaticSingletongetInstance(){returninstance;}}4Singleton模式模式形式二publicclassSingleton{privatestaticSingletoninstance=null;publicstaticsynchronizedSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}5Factory模式使用场景构建实例时需要进行大量初始化工作接口或基类有多个类似的派生类6Factory模式模式形式publicclassFactory{publicstaticSamplecreator(intwhich){if(which==1)returnnewSampleA();elseif(which==2)returnnewSampleB();}}7抽象工厂模式抽象工厂模式与简单工厂模式的区别在于需要创建对象的复杂程度上抽象工厂模式将Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现假设:Sample有两个实现类SampleA和SamleB,而Sample2也有两个实现类Sample2A和SampleB28抽象工厂模式模式形式publicabstractclassFactory{publicabstractSamplecreator();publicabstractSample2creator(Stringname);}publicclassSimpleFactoryextendsFactory{publicSamplecreator(){.........returnnewSampleA}publicSample2creator(Stringname){.........returnnewSample2A}}9抽象工厂模式publicclassBombFactoryextendsFactory{publicSamplecreator(){......returnnewSampleB}publicSample2creator(Stringname){......returnnewSample2B}}10Prototype(原型)应用场景用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象在Java中Prototype模式变成clone()方法的使用11Prototype(原型)publicabstractclassAbstractSpoonimplementsCloneable{StringspoonName;publicvoidsetSpoonName(StringspoonName){this.spoonName=spoonName;}publicStringgetSpoonName(){returnthis.spoonName;}publicObjectclone(){Objectobject=null;try{object=super.clone();}catch(CloneNotSupportedExceptionexception){System.err.println(AbstractSpoonisnotCloneable);}returnobject;}}12Prototype示例publicclassSoupSpoonextendsAbstractSpoon{publicSoupSpoon(){setSpoonName(SoupSpoon);}}AbstractSpoonspoon=newSoupSpoon();AbstractSpoonspoon2=spoon.clone();13Builder模式应用场景将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示14Builder示例publicinterfaceBuilder{//创建部件A比如创建汽车车轮voidbuildPartA();//创建部件B比如创建汽车方向盘voidbuildPartB();//创建部件C比如创建汽车发动机voidbuildPartC();//返回最后组装成品结果(返回最后装配好的汽车)//成品的组装过程不在这里进行,而是转移到下面//的Director类中进行。从而实现了解耦过程和部件ProductgetResult();}15Builder示例publicclassDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}//将部件partABC最后组成复杂对象的过程publicvoidconstruct(){builder.buildPartA();builder.buildPartB();builder.buildPartC();}}16Builder示例publicclassConcreteBuilderimplementsBuilder{PartpartA,partB,partC;publicvoidbuildPartA(){//这里是具体如何构建partA的代码};publicvoidbuildPartB(){//这里是具体如何构建partB的代码};publicvoidbuildPartC(){//这里是具体如何构建partB的代码};publicProductgetResult(){//返回最后组装成品结果};}17Builder示例ConcreteBuilderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);director.construct();Productproduct=builder.getResult();18Adapter模式应用场景将两个不兼容的类纠合在一起使用属于结构型模式需要有Adaptee(被适配者)和Adaptor(适配器)两个身份19Adapter示例假设有两种类:方形桩圆形桩publicclassSquarePeg{publicvoidinsert(Stringstr){System.out.println(SquarePeginsert():+str);}}publicclassRoundPeg{publicvoidinsertIntohole(Stringmsg){System.out.println(RoundPeginsertIntoHole():+msg);}}20Adapter示例现在有一个应用,需要既打方形桩,又打圆形桩.我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改21Adapter示例publicclassPegAdapterextendsSquarePeg{privateRoundPegroundPeg;publicPegAdapter(RoundPegpeg)(this.roundPeg=peg;)publicvoidinsert(Stringstr){roundPeg.insertIntoHole(str);}}22Adapter思考问题上面的PegAdapter是继承了SquarePeg如果想两边继承,即继承SquarePeg又继承RoundPeg,该如何处理?23Composite(组合)应用场景对象以树形结构组织起来组合体内这些对象都有共同接口当组合体一个对象的方法被调用执行时,Composite将遍历整个树形结构,寻找同样包含这个方法的对象并实现调用执行24Composite示例publicabstractclassEquipment{privateStringname;//网络价格publicabstractdoublenetPrice();//折扣价格publicabstractdoublediscountPrice();//增加部件方法publicbooleanadd(Equipmentequipment){returnfalse;}//删除部件方法publicbooleanremove(Equipmentequipment){returnfalse;}//注意这里,这里就提供一种用于访问组合体类的部件方法。publicIteratoriter(){returnnull;}publicEquipment(finalStringname){this.name=name;}}25Composite示例publicclassDiskextendsEquipment{publicDisk(Stringname){super(name);}//定义Disk网络价格为1publicdoublenetPrice(){return1.;}//定义了disk折扣价格是0.5对折。publicdoublediscountPrice(){return.5;}}26Composite示例Cabinetcabinet=newCabinet(Tower);Chassischassis=newChassis(PCChassis);//将Chassis装到Tower中(将盘盒装到箱子里)cabinet.add(chassis);//将一个硬盘装到Chassis(将硬盘装到盘盒里)chassis.add(newDisk(10GB));//调用netPrice()方法;System.out.println(netPrice=+cabinet.netPrice());27Proxy(代理)应用场景为其他对象提供一种代理以控制对这个对象的访问授权机制不同级别的用户对同一对象拥有不同的访问权利某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动示例参见Proxy.java28Decorator应用场景拓展功能由用户动态决定加入的方式和时机在运行期间决定何时增加何种功能29Decorator示例定义接口publicinterfaceWork{publicvoidinsert();}30Decorator示例接口的实现,完成一件具体工作publicclassSquarePegimplementsWork{publicvoidinsert(){System.out.println(方形桩插入);}}31Bridge应用场景将抽象和行为划分开来,各自独立,但能动态的结合示例Bridge.java32Observer应用场景对于一个事件源,有多个监听者Java的API还为为我们提供现成的Observer接口Java.util.ObserverAlarmObserver.javaWsfAlarmPool.java33小结Singleton模式Factory模式dd抽象工厂模式Prototype(原型)Builder模式Adapter示例Composite(组合)Proxy(代理)DecoratorBridgeObserver