文档详情

面向对象设计模式—创建型模式.doc

发布:2018-04-16约4.8千字共10页下载文档
文本预览下载声明
面向对象设计模式—创建型模式(学习笔记) 学习资料: 1、《设计模式:可服用面向对象软件的基础》 2、《敏捷软件开发:原则、模式与实践》 3、《重构:改善既有代码的设计》 4、《Refactoring to Patterns》 5、《面向对象分析与设计》 场景 设计一个人事管理系统,其中一个功能是对不同类型的员工,计算当月的工资——不同类型的员工,拥有不同的薪金计算制度。 结构化设计 (1)获得人事系统中所有可能员工类型; (2)根据不同的员工类型所对应的不同薪金制度,计算其工资。 面向对象设计 (1)根据不同的员工类型设计不同的类,并使这些类继承自一个Employee抽象类,其中有一个抽象方法GetSalary; (2)在不同的员工类中,根据自己的薪金制度,重写GetSalary方法。 需求改变…… 场景 随着客户公司业务规模的拓展,又出现了更多类型的员工 结构化设计 几乎所有涉及到员工类型的地方都需要做改变 面向对象设计 只需要在新的文件里添加新的员工类,让其继承自Employee抽象类,并重写GetSarary()方法,然后在EmployeeFactory.GetEmployee方法中根据相关条件,产生新的员工类型 面向对象设计三大原则: 1、针对接口编程,而不是针对实现编程; 2、优先使用对象组合(has a),而不是类继承(is a); 3、封装变化点; 使用重构得到模式——设计模式的应用不宜先入为主 五条更具体的设计原则: 1、单一职责原则(SRP) — 一个类应该仅有一个引起它变化的原因 2、开放封闭原则(OCP) — 类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭) 3、Liskov替换原则(LSP) — 子类必须能够替换它们的基类 4、依赖倒置原则(DIP) — 高层模块不应该依赖于底层模块,二者都应该依赖于抽象 — 抽象不应该依赖于实现细节,实现细节应该依赖于抽象 5、接口隔离原则(ISP) — 不应该强迫客户程序依赖于它们不用的方法 模式分类: 1、从目的看 — 创建型(Creational)模式:负责对象创建 — 结构型(Structural)模式:处理类与对象间的组合 — 行为性(Behavionral)模式:类与对象交互中的职责分配 2、从范围来看 — 类模式处理类与子类的静态关系 — 对象模式处理对象间的动态关系 Singleton单件(创建型模式) 1、存在的问题 有一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率——类设计者的责任,而不是使用者的责任。 2、解决思路 — 封装变化点:哪里变化,封装哪里 — 潜台词:如果没有变化,当然不需要额外的封装 3、意图 保证一个类仅有一个实例,并提供一个该实例的全局访问点。 单线程Singleton模式的几个要点: 1、Singleton模式中的实例构造器可以设置为protected以允许子类派生; 2、Singleton模式一般不要支持IClonable接口; 3、Singleton模式一般不要支持序列化; 4、Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的管理; 5、Singleton模式不能用于多线程环境。 单线程Singleton模式扩展: 1、将一个实例扩展到具体的n个实例,例如对象池的实现(如Type); 2、将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的实例(如HttpContext); 3、理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。 Abstract Factory抽象工厂(创建型模式) new的问题 1、常规的对象创建方法:Road road = new Road(); 2、存在的问题 — 实现依赖,不能应对“具体实例化类型”的变化 3、解决思路 — 封装变化点:哪里变化,封装哪里 — 潜台词:如果没有变化,当然不需要额外的封装 工厂模式的缘起 1、变化点在“对象创建”,因此就封装“对象创建”; 2、面向接口编程—依赖接口而非依赖实现 3、简单工厂示例: (1)单一对象 class RoadFactory //--------------类库 { public static Road CreateRoad() { return new Road(); } } Road road = RoadFactory.CreateRoad(); //在其他地方实现——————客户程序 (2)多个相互依赖的对象 class
显示全部
相似文档