权巍主要内容9.1工厂模式(Factory)9.1.1简单工厂9.1.2工厂方法9.1.3抽象工厂9.2单例模式(Singleton)9.3里氏代换原则2UML和设计模式9.1工厂模式--创建型模式创建型模式(CreationalPattern)是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建型模式描述了怎样构造和封装这些动态的决定。创建型模式分为类的创建型模式和对象的创建型模式。3UML和设计模式9.1.1简单工厂模式创建对象问题:不能应对“具体实例化类型”的变化。开闭原则(对扩展开放、对修改封闭)解决思路:封装变化点——哪里变化,封装哪里常规方法创建对象:Roadroad=newRoad();Roadsandroad=newsandRoad();4UML和设计模式9.1.1简单工厂模式一个农场的例子5UML和设计模式简单工厂模式(静态工厂方法模式)就是一个工厂类根据传入的参数决定创建出哪一种产品类的实例。6UML和设计模式简单工厂模式的三个角色:工厂类角色模式的核心,负责根据传入的参数决定创建出哪种具体产品类的对象,通常为具体类。抽象产品由模式所创建的对象的父类,或它们共同拥有的接口担任,可为抽象类或接口。具体产品模式所创建的任何对象都是这个角色的实例,为具体类。7UML和设计模式示例代码(简单工厂)://抽象产品(接口或抽象类)interfaceRoad{……}//具体产品ClassrailRoadextendsRoad{……}ClasssandRoadextendsRoad{……}//具体工厂:是核心,负责创建具体产品classRoadFactory{publicstaticRoadCreateRoad(Stringname){//根据不同的情况(如名字等)创建不同的产品returnnewrailRoad();}……}//创建一个Road对象Roadroad=RoadFactory.CreateRoad(“railroad”);客户程序:8UML和设计模式简单工厂模式的优点:①设计简单,产品类的等级结构不会反映到工厂类中,从而产品类等级结构的变化也就不会影响到工厂类。②由工厂类决定何时创建何种产品类的对象,免除了客户端创建产品类对象的责任。缺点:①静态:增加新的产品(如WaterRoad)时,要修改工厂类,违反了面向对象设计的基本原则。②工厂类负责创建所有产品,一旦不能正常工作,整个程序都会受到影响。9UML和设计模式9.1.2工厂方法模式(多态性工厂模式)问题:需要频繁增加新的对象解决:封装变化点(抽象的工厂)10UML和设计模式在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做,即本模式中包含:抽象工厂、具体工厂。抽象工厂:负责给出具体工厂类必须实现的接口。具体工厂:实现抽象工厂接口,用于创建具体的产品实例。抽象产品具体产品(2)工厂方法模式(多态性工厂模式)11UML和设计模式农场例子---工厂方法模式UML和设计模式12//抽象产品(接口或抽象类)interfaceRoad{……}//具体产品classrailRoadimplementsRoad{……}classsandRoadimplementsRoad{……}//抽象工厂(稳定不变)interfaceRoadFactory{publicabstractRoadCreateRoad();}//railRoad、sandRoad等对象的具体工厂classrailRoadFactoryimplementsRoadFactory{publicRoadCreateRoad(){returnnewrailRoad();}}classsandRoadFactoryimplementsRoadFactory{publicRoadCreateRoad(){returnnewsandRoad();}}工厂方法模式代码实例classwaterRoadimplementsRoad{……}classwaterRoadFactoryimplementsRoadFactory{publicRoadCreateRoad(){returnnewwaterRoad();}}13UML和设计模式//客户端程序:依赖抽象工厂、抽象产品classClient{publicstaticvoidmain(String[]args){RoadFactoryrf1,rf2;Roadroad1,road2,road3;//实例化2个railRoad对象rf1=newrailRoadFactory();road1=rf1.CreateRoad();//稳定不变road2=rf1.CreateRoad();//实例化1个sandRoad对象rf2=newsandRoadFactory();road3=rf2.CreateRoad();}}14UML和设计模式9.1.3抽象工厂模式问题:经常需要创建一个新的系列,即产品族。产品族(ProductFamily):是指功能相关联的产品组成的家族。每个产品族包含相互依赖的对象,这些对象稳定不变。抽象工厂模式的意图:向客户提供一个接口,使得客户可以在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。15UML和设计模式抽象工厂模式类图结构ConcreteFactory3CreateProductA()CreateProductB()ProductA3ProductB316UML和设计模式抽象工厂:负责给出具体工厂类必须实现的接口,是模式的核心,与应用系统的逻辑无关。具体工厂:实现抽象工厂接口,直接在客户端的调用下创建产品实例。这个角色含有选择合适的产品对象的逻辑,与应用系统的逻辑紧密相关。抽象产品:具体产品:抽象工厂模式的角色17UML和设计模式(3)抽象工厂模式代码实例:抽象工厂:FacilityFactory具体工厂(对应产品族):IceFacilityFactory、DesertFacilityFactory。抽象产品:Road、Building、Tunnel具体产品:IceRoad、DesertRoad、IceBuilding、DesertBuilding、IceSky、DesertSky18UML和设计模式农场例子—抽象工厂模式UML和设计模式199.2单例模式(Singleton)UML和设计模式20单例模式的特点单例类只能有一个实例;单例类必须自己创建自己的这个唯一的实例;单例类必须给所有对象提供这一实例。什么是Singleton单例模式单例模式的意图:保证一个类仅有一个实例,并提供一个该类实例的全局访问点。UML和设计模式21单例模式的类图解析私有的构造方法类型为单例类本身的静态变量获得单例类的唯一实例的方法UML和设计模式22UML和设计模式23单例模式示意代码:publicclassSingleton{privatestaticSingletoninstance=null;//其它成员数据……protectedSingleton(){}publicstaticSingletongetInstance(){if(instance==null){instance=newSingleton();}returninstance;}}9.3里氏代换原则里氏代换原则(LiskovSubstitutionPrincipal,LSP)的严格表达如下:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。换言之,一个软件实体如果使用的是基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。UML和设计模式24