面向对象设计模式—创建型模式.doc
文本预览下载声明
面向对象设计模式—创建型模式(学习笔记)
学习资料:
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
显示全部