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

  • 格式:doc
  • 大小:55.00 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面向对象设计模式—创建型模式(学习笔记)

学习资料:

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 RoadFactory//--------------类库,无法实现不同风格(变化点) {

public static Road CreateRoad()

{

return new Road();

}

public static Building CreateBuilding()

{

return new Building();

}

public static Tunnel CreateTunnel()

{

return new Tunnel();

}

public static Jungle CreateJungle()

{

return new Jungle();

}

............ //创建其他对象

}

//以下代码在其他地方实现——————客户程序(相对稳定)

Road road = RoadFactory.CreateRoad();

Building building = RoadFactory.CreateBuilding();

............... //对象交互的代码

抽象工厂

1、存在的问题

—不能应对“不同系列对象”的变化(比如不同风格的对象)

2、解决思路

—使用面向对象的技术来“封装”变化点

—绕过常规的对象创建方法,避免客户程序和“多系列具体对象创建”的紧耦合—提供一个接口,让该接口负责“多系列具体对象创建”而不用指定具体的类3、意图

—实现“多种相互依赖的对象”的创建工作

—实现“多系列对象”的创建工作

4、应用要点