计算器的类设计工厂模式ppt课件.pptx_第1页
计算器的类设计工厂模式ppt课件.pptx_第2页
计算器的类设计工厂模式ppt课件.pptx_第3页
计算器的类设计工厂模式ppt课件.pptx_第4页
计算器的类设计工厂模式ppt课件.pptx_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式 DesignPattern 解决重复设计问题反复出现的设计问题的解决方案模式被用来在特定场景下 解决一般设计问题的类和相互通信的对象的描述处理同一类软件 分析结果的典型设计结构 面向对象的七大设计原则 1 开放封闭原则OCP2 单一职责SRP3 里氏代换LSP4 依赖倒转DIP5 迪米特法则LOD6 接口隔离ISP7 合成聚合复用原则CARP 对扩展开放 修改封闭职责的分离 低耦合is a 子类替换父类仅通过接口和抽象类产生依赖最少知识 最少相关尽可能小的单独的接口合成 聚合优先于继承 问题 Problem 实现计算器要求输入2个数和运算符 得到结果 控制台的代码 可复用其他项目 问题 Problem staticvoidMain string args Console Write 请输入数字A stringstrNumberA Console ReadLine Console Write 请选择运算符号 stringstrOperate Console ReadLine Console Write 请输入数字B stringstrNumberB Console ReadLine stringstrResult switch strOperate case strResult double Parse strNumberA double Parse strNumberB ToString break case strResult double Parse strNumberA double Parse strNumberB ToString break case strResult double Parse strNumberA double Parse strNumberB ToString break case if strNumberB 0 strResult double Parse strNumberA double Parse strNumberB ToString elsestrResult 除数不能为0 break Console WriteLine 结果是 strResult Console ReadLine 问题 Problem 实现计算器Ctrl C和Ctrl V维护的时候 带来灾难尽可能的办法去避免重复 通过面向对象设计 让数据计算和用户交互方式分开 单一职责原则数据计算和用户交互方式分开 classOperation publicstaticdoubleGetResult doublenumberA doublenumberB stringoperate doubleresult 0 switch operate case result numberA numberB break case result numberA numberB break case result numberA numberB break case result numberA numberB break returnresult staticvoidMain string args try Console Write 请输入数字A stringstrNumberA Console ReadLine Console Write 请选择运算符号 stringstrOperate Console ReadLine Console Write 请输入数字B stringstrNumberB Console ReadLine stringstrResult strResult Operation GetResult double Parse strNumberA double Parse strNumberB strOperate ToString Console WriteLine 结果是 strResult Console ReadLine catch Exceptionex Console WriteLine 您的输入有错 ex Message 单一职责原则数据计算和用户交互方式分开 privatevoidbtnNum Click objectsender EventArgse if bOperate textBox1 Text bOperate false textBox1 Text textBox1 Text Button sender Text privatevoidbtnOpertor Click objectsender EventArgse if textBox1 Text operate Button sender Text numberA double Parse textBox1 Text bOperate true privatevoidbtnEqu Click objectsender EventArgse if textBox1 Text numberB double Parse textBox1 Text textBox1 Text Operation GetResult numberA numberB operate ToString bOperate true boolbOperate false doublenumberA 0 doublenumberB 0 stringoperate 单一职责原则数据计算和用户交互方式分开 扩展问题 Problem 添加平方根运算 紧耦合vs松耦合Switch中添加一个分支 搞定 缺点 运算 的代码GetResult是正确的 却需要在修改的时候暴露 如何修改或添加新运算 不影响其它的运算代码 对扩展开放 对修改关闭 不被修改的前提下被扩展 所有面向对象原则的核心 软件设计本身所追求的目标就是封装变化 降低耦合 而开放封闭原则正是对这一目标的最直接体现 开放封闭原则 OCP OpenClosedPrinciple 其核心的思想是 软件实体应该是可扩展 而不可修改的 对扩展开放 意味着有新的需求或变化时 可以对现有代码进行扩展 以适应新的情况 对修改封闭 意味着类一旦设计完成 就可以独立完成其工作 而不要对类进行任何修改 实现开放封闭的核心思想就是对抽象编程 而不对具体编程 因为抽象相对稳定 让编程依赖于固定的抽象 所以对修改就是封闭的 而通过面向对象的继承和对多态机制 可以实现对抽象体的继承 通过覆写其方法来改变固有行为 实现新的扩展方法 所以对于扩展就是开放的 开放封闭原则 不被修改的前提下被扩展 添加新的运算 满足开放封闭原则 不被修改的前提下被扩展 classOperation privatedouble numberA 0 privatedouble numberB 0 publicdoubleNumberA get return numberA set numberA value publicdoubleNumberB get return numberB set numberB value publicvirtualdoubleGetResult return0 不被修改的前提下被扩展 加法类classOperationAdd Operation publicoverridedoubleGetResult doubleresult 0 result NumberA NumberB returnresult 减法类classOperationSub Operation publicoverridedoubleGetResult doubleresult 0 result NumberA NumberB returnresult 乘法类classOperationMul Operation publicoverridedoubleGetResult doubleresult 0 result NumberA NumberB returnresult 除法类classOperationDiv Operation publicoverridedoubleGetResult doubleresult 0 if NumberB 0 thrownewException 除数不能为0 result NumberA NumberB returnresult 问题 Problem staticvoidMain string args try Console Write 请输入数字A stringstrNumberA Console ReadLine Console Write 请选择运算符号 stringstrOperate Console ReadLine Console Write 请输入数字B stringstrNumberB Console ReadLine stringstrResult strResult Operation GetResult double Parse strNumberA double Parse strNumberB strOperate ToString if strOperate OperationAddadd newOperationAdd add NumberA double Parse strNumberA add NumberB double Parse strNumberB strResult add GetResult ToString Console WriteLine 结果是 strResult Console ReadLine catch Exceptionex Console WriteLine 您的输入有错 ex Message 新问题 虽然满足了开放封闭原则 单一职责原则 但是众多类 使用起来非常不方便 对象的创建和使用的分离 对象的创建和使用的分离 classOperationFactory publicstaticOperationcreateOperate stringoperate Operationoper null switch operate case oper newOperationAdd break case oper newOperationSub break returnoper 负责对象创建 对象的创建和使用的分离 staticvoidMain string args try Console Write 请输入数字A stringstrNumberA Console ReadLine Console Write 请选择运算符号 stringstrOperate Console ReadLine Console Write 请输入数字B stringstrNumberB Console ReadLine stringstrResult Operationoper oper OperationFactory createOperate strOperate oper NumberA Convert ToDouble strNumberA oper NumberB Convert ToDouble strNumberB strResult oper GetResult ToString Console WriteLine 结果是 strResult Console ReadLine catch Exceptionex Console WriteLine 您的输入有错 ex Message 只需简单参数即可获得所需对象 实现对象的创建和使用的分离 负责对象使用 简单工厂模式 SimpleFactory 根据自变量的不同 返回不同的类的实例 简单工厂模式专门定义一个类 来负责创建其它类的实例 被创建的实例通常都具有共同的父类 模式动机 考虑一个简单场景 多个外观不同的按钮 都源自同一个基类 不同的子类修改了部分属性 从而可以呈现不同的外观 如果我们希望不需要知道这些具体按钮类的名字 只需要知道按钮类的一个参数 并提供一个调用方便的方法 把该参数传入方法 即可返回一个相应的按钮对象 简单工厂模式 SimpleFactory 模式结构 CreateOperate stringoperate returnnewConcreteProduct 简单工厂模式 SimpleFactory 优点 工厂类含有必要的判断逻辑 可以决定在什么时候创建哪一个产品类的实例 客户端可以免除直接创建产品对象的责任 而仅仅 消费 产品 简单工厂模式通过这种做法实现了对象创建和使用的分离 客户端代码简洁 无需知道所创建具体产品的类名 只需知道对应的参数 可以减少使用者的记忆量 缺点工厂类集中了所有产品创建逻辑 一旦不能正常工作 整个系统都要受到影响 增加了类的数量 增加了系统的复杂度和理解难度 系统扩展困难 一旦添加新产品就不得不修改工厂逻辑 有可能造成工厂逻辑过于复杂 不利于扩展 简单工厂模式通常使用静态工厂方法 造成工厂角色无法形成基于继承的等级结构 简单工厂模式 SimpleFactory 模式应用根据各类算法的密码生成器 根据各类数据进行图表绘制 问题 用户要求增加新运算 classOperationFactory publicstaticOperationcreateOperate stringoperate Operationoper null switch operate case oper newOperationAdd break case oper newOperationSub break case returnoper 修改类代码 违背了开放封闭原则 模式动机 简单工厂模式如果需要增加新类型 那么需要修改工厂类的代码 违反了 开放封闭原则 定义一个抽象的工厂类 而定义具体的工厂类来实现这个抽象按钮工厂类中定义的方法 父类 抽象工厂类 负责定义创建对象的公共接口 而子类则负责生成具体的对象 将类的实例化操作 延迟到子类中完成 即由子类来决定究竟应该实例化 创建 哪一个类 故此模式也叫多态模式 工厂方法模式 FactoryMethod 简单工厂模式 SimpleFactory 使用频率最高的设计模式之一 是很多开源框架和API类库的核心模式 工厂方法模式 FactoryMethod 简单工厂模式 SimpleFactory 工厂方法模式 FactoryMethod 抽象工厂方法interfaceIFactory OperationCreateOperation 专门负责生产 的工厂classMulFactory IFactory publicOperationCreateOperation returnnewOperationMul 专门负责生产 的工厂classDivFactory IFactory publicOperationCreateOperation returnnewOperationDiv 专门负责生产 的工厂classAddFactory IFactory publicOperationCreateOperation returnnewOperationAdd 专门负责生产 的工厂classSubFactory IFactory publicOperationCreateOperation returnnewOperationSub 工厂方法模式 FactoryMethod staticvoidMain string args try Console Write 请输入数字A stringstrNumberA Console ReadLine Console Write 请输入数字B stringstrNumberB Console ReadLine stringstrResult IFactoryoperFactory newAddFactory Operationoper operFactory CreateOperation oper NumberA Convert ToDouble strNumberA oper NumberB Convert ToDouble strNumberB strResult oper GetResult ToString Console WriteLine 结果是 strResult Console ReadLine catch Exceptionex Console WriteLine 您的输入有错 ex Message 工厂方法模式 FactoryMethod 模式结构 returnnewConcreteProduct 抽象工厂 具体工厂 工厂方法模式 FactoryMethod 优点如下创建与使用分离 还向客户隐藏了创建产品的细节 甚至无需知道产品类的类名 基于工厂角色和产品角色的多态性设计 能够使工厂可以自主确定创建何种产品对象 而如何创建这个对象的细节则完全封装在具体工厂内部 缺点如下添加新产品时 需要编写新的具体产品类 及对应的具体工厂类 类成对增加 运行时系统会有额外的开销 考虑到系统的可扩展性 需要引入抽象层 增加了系统的抽象性和理解难度 增加了系统的实现难度 工厂方法模式 FactoryMethod 模式使用 不能清楚知道所必须创建的对象的类 一个类希望由它的子类来指定它所创建的对象 将创建对象的职责委托给多个子类中的某一个 且不同子类提供不同实现 设计模式分类 根据其目的 模式是用来做什么的 可分为创建型 Creational 结构型 Structural 和行为型 Behavioral 三种 创建型模式主要用于创建对象 结构型模式主要用于处理类或对象的组合 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责 设计模式意图描述 一 创建型模式单例模式 Singleton 保证一个类仅有一个实例 并提供一个访问它的全局访问点 原型模式 Prototype 用原型实例指定创建对象的种类 并且通过拷贝这些原型创建新的对象工厂方法 FactoryMethod 定义一个用于创建对象的接口 让子类决定实例化哪一个类 抽象工厂 AbstractFactory 提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 建造者 Builder 将一个复杂对象的构建与它的表示分离 使得同样的构建过程可以创建不同的表示 设计模式意图描述 二 结构型模式适配器模式 Adapter 将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 桥接模式 Bridge 将抽象部分与它的实现部分分离 使它们都可以独立地变化 组合模式 Compsite 将对象组合成树形结构以表示 部分 整体 的层次结构 Composite使得用户对单个对象和组合对象的使用具有一致性 装饰模式 Decorator 动态地给一个对象添加一些额外的职责 就增加功能来说 Decorator模式相比生成子类更为灵活外观模式 Facade 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 享元模式 Flyweight 运用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论