《软件设计模式ch4 - 工厂方法模式.ppt》由会员分享,可在线阅读,更多相关《软件设计模式ch4 - 工厂方法模式.ppt(90页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、软件设计方法及设计模式软件设计方法及设计模式张聚礼张聚礼张聚礼张聚礼 副教授副教授副教授副教授/系统分析师系统分析师系统分析师系统分析师工工 厂厂 方方 法法 模模 式式4一一二二三三四四五五六六对象村比萨对象村比萨对象村比萨对象村比萨简单工厂简单工厂简单工厂简单工厂工厂方法模式工厂方法模式工厂方法模式工厂方法模式比萨店比萨店比萨店比萨店抽象工厂模式抽象工厂模式抽象工厂模式抽象工厂模式比较工厂方法和抽象工厂比较工厂方法和抽象工厂比较工厂方法和抽象工厂比较工厂方法和抽象工厂主要内容主要内容一、对象村比萨一、对象村比萨思考思考“new”new”识别变化的部分识别变化的部分 新的问题新的问题 (一一
2、)(二二)(三三)l看到看到看到看到newnew,就会想到,就会想到,就会想到,就会想到具体具体具体具体(一一)思考思考“newnew”l一般用法一般用法一般用法一般用法(一一)思考思考“newnew”l同理同理同理同理(一一)思考思考“newnew”l这样,一旦发生变化,必须重新检查并修改该代这样,一旦发生变化,必须重新检查并修改该代这样,一旦发生变化,必须重新检查并修改该代这样,一旦发生变化,必须重新检查并修改该代码,缺乏柔性,不便于维护。码,缺乏柔性,不便于维护。码,缺乏柔性,不便于维护。码,缺乏柔性,不便于维护。(一一)思考思考“newnew”l但是,总要使用但是,总要使用但是,总要使
3、用但是,总要使用newnew的。的。的。的。l真正的问题是变化产生的。真正的问题是变化产生的。真正的问题是变化产生的。真正的问题是变化产生的。(一一)思考思考“newnew”l假如你有一个比萨店,代码可能假如你有一个比萨店,代码可能假如你有一个比萨店,代码可能假如你有一个比萨店,代码可能如下:如下:如下:如下:(二二)识别变化的部分识别变化的部分l这样,需要更多的比萨类型。这样,需要更多的比萨类型。这样,需要更多的比萨类型。这样,需要更多的比萨类型。(二二)识别变化的部分识别变化的部分l问题是需要增加更多的比萨类型。问题是需要增加更多的比萨类型。问题是需要增加更多的比萨类型。问题是需要增加更多
4、的比萨类型。(三三)新的问题新的问题二、简单工厂二、简单工厂封装创建对象的代码封装创建对象的代码 建立简单的比萨工厂建立简单的比萨工厂 (一一)(二二)定义简单工厂定义简单工厂 (三三)使用框架使用框架 (四四)允许子类做决定允许子类做决定 (五五)l把创建比萨的代码移到另一个对象中。把创建比萨的代码移到另一个对象中。把创建比萨的代码移到另一个对象中。把创建比萨的代码移到另一个对象中。(一一)封装创建对象的代码封装创建对象的代码l这个新对象称为这个新对象称为这个新对象称为这个新对象称为“工厂工厂工厂工厂”工厂处理创建对象的细节工厂处理创建对象的细节工厂处理创建对象的细节工厂处理创建对象的细节(
5、一一)封装创建对象的代码封装创建对象的代码(二二)建立简单的比萨工厂建立简单的比萨工厂l重做重做重做重做PizzaStorePizzaStore类类类类(二二)建立简单的比萨工厂建立简单的比萨工厂(三三)定义简单工厂定义简单工厂l针对接口编程可以隔离掉系统以后可能发生的一针对接口编程可以隔离掉系统以后可能发生的一针对接口编程可以隔离掉系统以后可能发生的一针对接口编程可以隔离掉系统以后可能发生的一大堆改变。大堆改变。大堆改变。大堆改变。l用静态方法定义的工厂被成为静态工厂,这样就用静态方法定义的工厂被成为静态工厂,这样就用静态方法定义的工厂被成为静态工厂,这样就用静态方法定义的工厂被成为静态工厂
6、,这样就不用使用创建对象的方法来实例化对象,使用方不用使用创建对象的方法来实例化对象,使用方不用使用创建对象的方法来实例化对象,使用方不用使用创建对象的方法来实例化对象,使用方便。但是这样做的缺点是无法通过继承来改变创便。但是这样做的缺点是无法通过继承来改变创便。但是这样做的缺点是无法通过继承来改变创便。但是这样做的缺点是无法通过继承来改变创建方法的行为。建方法的行为。建方法的行为。建方法的行为。l简单工厂不是一种设计模式,但是它比较常用。简单工厂不是一种设计模式,但是它比较常用。简单工厂不是一种设计模式,但是它比较常用。简单工厂不是一种设计模式,但是它比较常用。(三三)定义简单工厂定义简单工
7、厂l加盟比萨店加盟比萨店加盟比萨店加盟比萨店(三三)定义简单工厂定义简单工厂l现在的做法。现在的做法。现在的做法。现在的做法。(三三)定义简单工厂定义简单工厂l但是,想要但是,想要但是,想要但是,想要更多的质量更多的质量更多的质量更多的质量控制控制控制控制(三三)定义简单工厂定义简单工厂l修改修改修改修改PizzaStorePizzaStore类类类类(四四)使用框架使用框架(五五)允许子类做决定允许子类做决定l子类如何做决定子类如何做决定子类如何做决定子类如何做决定(五五)允许子类做决定允许子类做决定l从从从从orderPizzaorderPizza()()来看来看来看来看(五五)允许子类做
8、决定允许子类做决定lorderPizzaorderPizza()()做了许多事情做了许多事情做了许多事情做了许多事情(五五)允许子类做决定允许子类做决定l当当当当orderPizzaorderPizza()()调用调用调用调用createPizzacreatePizza()()时,比萨店子时,比萨店子时,比萨店子时,比萨店子类负责创建比萨。做哪一种比萨由比萨店来决定。类负责创建比萨。做哪一种比萨由比萨店来决定。类负责创建比萨。做哪一种比萨由比萨店来决定。类负责创建比萨。做哪一种比萨由比萨店来决定。(五五)允许子类做决定允许子类做决定三、工厂方法模式三、工厂方法模式开比萨店开比萨店 声明工厂方法
9、声明工厂方法 认识工厂方法模式认识工厂方法模式 (一一)(二二)(三三)平行的类层级平行的类层级 (四四)定义工厂方法模式定义工厂方法模式 (五五)(一一)开比萨店开比萨店l纽约风味比萨店纽约风味比萨店纽约风味比萨店纽约风味比萨店(一一)开比萨店开比萨店l芝加哥风味比萨店、加州风味比萨店芝加哥风味比萨店、加州风味比萨店芝加哥风味比萨店、加州风味比萨店芝加哥风味比萨店、加州风味比萨店(二二)声明工厂方法声明工厂方法(二二)声明工厂方法声明工厂方法l工厂方法工厂方法工厂方法工厂方法 (二二)声明工厂方法声明工厂方法l如何使用比萨工厂方法订购比萨呢?如何使用比萨工厂方法订购比萨呢?如何使用比萨工厂方
10、法订购比萨呢?如何使用比萨工厂方法订购比萨呢?(二二)声明工厂方法声明工厂方法l如何订购如何订购如何订购如何订购需要比萨店的实例需要比萨店的实例需要比萨店的实例需要比萨店的实例有了各自的有了各自的有了各自的有了各自的PizzaStorePizzaStore,分别调用,分别调用,分别调用,分别调用orderPizzaorderPizza()()方法,方法,方法,方法,传入各自喜爱的比萨类型传入各自喜爱的比萨类型传入各自喜爱的比萨类型传入各自喜爱的比萨类型调用调用调用调用createPizzacreatePizza()()方法创建比萨方法创建比萨方法创建比萨方法创建比萨orderPizzaorde
11、rPizza()()方法并不知道真正创建的是哪种比萨,但方法并不知道真正创建的是哪种比萨,但方法并不知道真正创建的是哪种比萨,但方法并不知道真正创建的是哪种比萨,但知道这是一个比萨。这就够了,不是吗?知道这是一个比萨。这就够了,不是吗?知道这是一个比萨。这就够了,不是吗?知道这是一个比萨。这就够了,不是吗?(二二)声明工厂方法声明工厂方法l订单比萨订单比萨订单比萨订单比萨 (二二)声明工厂方法声明工厂方法(二二)声明工厂方法声明工厂方法(二二)声明工厂方法声明工厂方法(二二)声明工厂方法声明工厂方法(二二)声明工厂方法声明工厂方法l现在,来实现比萨现在,来实现比萨现在,来实现比萨现在,来实现比
12、萨 (二二)声明工厂方法声明工厂方法l现在,来实现比萨(续)现在,来实现比萨(续)现在,来实现比萨(续)现在,来实现比萨(续)(二二)声明工厂方法声明工厂方法l还需要一些子类还需要一些子类还需要一些子类还需要一些子类 (二二)声明工厂方法声明工厂方法l还需要一些子类(续)还需要一些子类(续)还需要一些子类(续)还需要一些子类(续)(二二)声明工厂方法声明工厂方法l现在,来吃比萨吧现在,来吃比萨吧现在,来吃比萨吧现在,来吃比萨吧(二二)声明工厂方法声明工厂方法lRUNRUN(三三)认识工厂方法模式认识工厂方法模式lCreatorCreator类类类类(三三)认识工厂方法模式认识工厂方法模式lPr
13、oductProduct类类类类(四四)平行的类层级平行的类层级l两者之间的关系两者之间的关系两者之间的关系两者之间的关系(五五)定义工厂方法模式定义工厂方法模式l工厂(工厂(工厂(工厂(Factory Method PatternFactory Method Pattern)方法模式:定)方法模式:定)方法模式:定)方法模式:定义了一个创建对象的接口,但是由子类来决定要实义了一个创建对象的接口,但是由子类来决定要实义了一个创建对象的接口,但是由子类来决定要实义了一个创建对象的接口,但是由子类来决定要实例化的类是哪一个。它让类把实例化推迟到了子类。例化的类是哪一个。它让类把实例化推迟到了子类。
14、例化的类是哪一个。它让类把实例化推迟到了子类。例化的类是哪一个。它让类把实例化推迟到了子类。(五五)定义工厂方法模式定义工厂方法模式四、比萨店四、比萨店对象依赖对象依赖 依赖倒置原则依赖倒置原则 (一一)(二二)比萨店比萨店 (三三)(一一)对象依赖对象依赖l设计原则六:设计原则六:设计原则六:设计原则六:要依赖抽象,不要依赖具体类。要依赖抽象,不要依赖具体类。要依赖抽象,不要依赖具体类。要依赖抽象,不要依赖具体类。(二二)依赖倒置原则依赖倒置原则l例如:例如:例如:例如:(二二)依赖倒置原则依赖倒置原则l依赖倒置原则说明不能依赖倒置原则说明不能依赖倒置原则说明不能依赖倒置原则说明不能让高层组
15、件依赖于底层让高层组件依赖于底层让高层组件依赖于底层让高层组件依赖于底层组件,而且它们都应该组件,而且它们都应该组件,而且它们都应该组件,而且它们都应该依赖于抽象。依赖于抽象。依赖于抽象。依赖于抽象。(二二)依赖倒置原则依赖倒置原则l倒置思考方式倒置思考方式倒置思考方式倒置思考方式实现一个比萨店,首先实现一个比萨店,首先实现一个比萨店,首先实现一个比萨店,首先应该从顶端开始,然后应该从顶端开始,然后应该从顶端开始,然后应该从顶端开始,然后到具体的类。到具体的类。到具体的类。到具体的类。(二二)依赖倒置原则依赖倒置原则现在,倒置想法,不从现在,倒置想法,不从现在,倒置想法,不从现在,倒置想法,不
16、从顶端开始,想到要抽象顶端开始,想到要抽象顶端开始,想到要抽象顶端开始,想到要抽象一个一个一个一个PizzaPizza。(二二)依赖倒置原则依赖倒置原则现在,重新思考比萨店现在,重新思考比萨店现在,重新思考比萨店现在,重新思考比萨店的设计,需要用到工厂的设计,需要用到工厂的设计,需要用到工厂的设计,需要用到工厂方法。方法。方法。方法。(二二)依赖倒置原则依赖倒置原则l遵循的原则遵循的原则遵循的原则遵循的原则变量不可以持有具体类的引用。这可以通过使用工厂避变量不可以持有具体类的引用。这可以通过使用工厂避变量不可以持有具体类的引用。这可以通过使用工厂避变量不可以持有具体类的引用。这可以通过使用工厂
17、避开。开。开。开。不要让类派生自具体类。否则就会依赖具体类,违反了不要让类派生自具体类。否则就会依赖具体类,违反了不要让类派生自具体类。否则就会依赖具体类,违反了不要让类派生自具体类。否则就会依赖具体类,违反了“针对接口编程,而不是针对现实编程针对接口编程,而不是针对现实编程针对接口编程,而不是针对现实编程针对接口编程,而不是针对现实编程”的软件设计原的软件设计原的软件设计原的软件设计原则。则。则。则。不要覆盖基类中已实现的方法。出现这样的情况就说明不要覆盖基类中已实现的方法。出现这样的情况就说明不要覆盖基类中已实现的方法。出现这样的情况就说明不要覆盖基类中已实现的方法。出现这样的情况就说明基
18、类设计的有问题。基类设计的有问题。基类设计的有问题。基类设计的有问题。(二二)依赖倒置原则依赖倒置原则(二二)依赖倒置原则依赖倒置原则l具有弹性框架,并遵循设计原则。具有弹性框架,并遵循设计原则。具有弹性框架,并遵循设计原则。具有弹性框架,并遵循设计原则。(三三)比萨店比萨店l确保原料一致确保原料一致确保原料一致确保原料一致(三三)比萨店比萨店l原料家族原料家族原料家族原料家族(三三)比萨店比萨店l原料家族(续)原料家族(续)原料家族(续)原料家族(续)(三三)比萨店比萨店l原料家族(续)原料家族(续)原料家族(续)原料家族(续)(三三)比萨店比萨店l原料家族(续)原料家族(续)原料家族(续)
19、原料家族(续)(三三)比萨店比萨店l建造原料工厂建造原料工厂建造原料工厂建造原料工厂(三三)比萨店比萨店l建造纽约原料工厂建造纽约原料工厂建造纽约原料工厂建造纽约原料工厂(三三)比萨店比萨店l重做重做重做重做PizzaPizza(三三)比萨店比萨店l重做重做重做重做PizzaPizza(续)(续)(续)(续)(三三)比萨店比萨店l重做重做重做重做PizzaPizza(续)(续)(续)(续)(三三)比萨店比萨店l回到比萨店回到比萨店回到比萨店回到比萨店(三三)比萨店比萨店l看看,我们做了看看,我们做了看看,我们做了看看,我们做了什么什么什么什么(三三)比萨店比萨店l更多的比萨更多的比萨更多的比萨
20、更多的比萨(三三)比萨店比萨店l更多的比萨(续)更多的比萨(续)更多的比萨(续)更多的比萨(续)(三三)比萨店比萨店l更多的比更多的比更多的比更多的比萨(续)萨(续)萨(续)萨(续)(三三)比萨店比萨店五、五、抽象工厂模式抽象工厂模式定义定义 类图类图 (一一)(二二)从比萨店的观点看从比萨店的观点看 (三三)(一一)定义定义l抽象工厂模式:提供一个接口,用于创建相关或者抽象工厂模式:提供一个接口,用于创建相关或者抽象工厂模式:提供一个接口,用于创建相关或者抽象工厂模式:提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。依赖对象的家族,而不需要明确指定具体类。依赖对象的家族
21、,而不需要明确指定具体类。依赖对象的家族,而不需要明确指定具体类。(二二)类图类图(三三)从比萨店的观点看从比萨店的观点看六、六、比较工厂方法和抽象工厂比较工厂方法和抽象工厂工厂方法工厂方法 抽象工厂抽象工厂 (一一)(二二)(一一)工厂方法工厂方法(二二)抽象工厂抽象工厂七、总结七、总结AbstractionAbstractionEncapsulationEncapsulationPolymorphismPolymorphismInheritanceInheritanceEncapsulate what Encapsulate what varies.varies.Favor Favor c
22、omposition over composition over inheritenceinheritence.Program to Program to interfaces,not interfaces,not implementations.implementations.Strategy-defines a Strategy-defines a family of algorithms,family of algorithms,encapsulates each encapsulates each one,and makes them one,and makes them interc
23、hangeable.interchangeable.Strategy lets the Strategy lets the algorithm vary algorithm vary independently from independently from clients that use it.clients that use it.总结总结OO BasicsOO BasicsOO PrinciplesOO PrinciplesOO PatternsOO Patterns1Observer-defines a Observer-defines a one-to-many one-to-ma
24、ny dependency between dependency between objects so that when objects so that when one object changes one object changes state,all its state,all its dependents are dependents are notified and updated notified and updated automaticallyautomatically总结总结OO PatternsOO PatternsStrive for loosely Strive f
25、or loosely coupled designs coupled designs between objects between objects that interact.that interact.OO PrinciplesOO Principles2Decorator-Attach Decorator-Attach additional additional responsibilities to an responsibilities to an object dynamically.object dynamically.Decorators provide a Decorator
26、s provide a flexible alternative to flexible alternative to subclassingsubclassing for for extending extending functionality.functionality.总结总结OO PatternsOO PatternsClasses should Classes should be open for be open for extension but extension but closed for closed for modification.modification.OO Pr
27、inciplesOO Principles3Abstract Factory-Abstract Factory-Provide an interface Provide an interface for creating families of for creating families of related or related or depedentdepedent objects without objects without specifying their specifying their concrete classes.concrete classes.Factory Metho
28、d-Factory Method-Define an interface for Define an interface for creating an object,but creating an object,but let subclasses decide let subclasses decide which class to which class to instantiate.Factory instantiate.Factory Method lets a class Method lets a class defer instantiation to defer instantiation to the subclasses.the subclasses.总结总结OO PatternsOO PatternsDepend on Depend on abstractions.Do abstractions.Do not depend on not depend on concrete classes.concrete classes.OO PrinciplesOO Principles4