1. UML 图
- 定义与类型:统一建模语言(UML)用于软件可视化设计,具有简单、统一、图形化等特点,包含用例图、类图等 9 种图。
- 类图表示法
- 类的表示:在 UML 类图中,类用包含类名、属性和方法且带分割线的矩形表示,属性和方法前的符号表示可见性(
+
表示public
,-
表示private
,#
表示protected
)。 - 类间关系
- 关联关系:对象间的引用关系,分为单向关联(带箭头实线)、双向关联(不带箭头直线)和自关联(带箭头指向自身的线)。
- 聚合关系:整体和部分的强关联关系,部分可脱离整体独立存在,用带空心菱形的实线表示。
- 组合关系:更强烈的整体与部分关系,整体控制部分生命周期,部分不能脱离整体,用带实心菱形的实线表示。
- 依赖关系:对象间耦合度最弱的使用关系,通过局部变量、方法参数或静态方法调用体现,用带箭头的虚线表示。
- 继承关系:体现一般与特殊的关系,即父类与子类关系,用带空心三角箭头的实线表示。
- 实现关系:接口与实现类之间的关系,类实现接口中声明的抽象操作,用带空心三角箭头的虚线表示。
- 类的表示:在 UML 类图中,类用包含类名、属性和方法且带分割线的矩形表示,属性和方法前的符号表示可见性(
2. 软件设计原则
- 开闭原则:对扩展开放,对修改关闭,借助接口和抽象类实现热插拔效果。
- 里氏代换原则:子类对象能替换父类对象且程序行为不变。
- 依赖倒转原则:高层和低层模块都依赖抽象,抽象不依赖细节。
- 接口隔离原则:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。
- 合成复用原则:尽量先使用组合或聚合等关联关系实现复用,其次考虑继承关系。继承复用存在破坏封装性、耦合度高、灵活性低等缺点,而组合或聚合复用能维持封装性、降低耦合度、提高复用灵活性。
3. 创建型设计模式
3.1 单例设计模式
- 结构:包含单例类(只能创建一个实例的类)和访问类(使用单例类)。
- 实现方式
- 饿汉式:类加载就会创建单实例对象,包括静态变量方式和静态代码块方式。
- 懒汉式:类加载不会创建单实例对象,首次使用时才创建,包括线程不安全方式、线程安全方式和双重检查锁方式。
- 存在问题及解决:序列化和反射会破坏单例模式,可在单例类中添加
readResolve()
方法解决序列化问题;枚举方式可避免这两个问题。
3.2 工厂模式
- 简单工厂模式
- 结构:包含抽象产品、具体产品和具体工厂。
- 实现:通过工厂类创建产品对象,可将创建对象的功能定义为静态的(静态工厂模式)。
- 优缺点:优点是封装对象创建过程,降低客户代码修改可能性;缺点是增加新产品需修改工厂类代码,违背开闭原则。
- 模式扩展:简单工厂结合配置文件可解除工厂对象和产品对象的耦合。
- 工厂方法模式
- 结构:包括抽象工厂、具体工厂、抽象产品和具体产品。
- 实现:定义抽象工厂接口,具体工厂实现接口创建具体产品,解决了简单工厂模式的缺点,遵循开闭原则。
- 优缺点:优点是用户只需知道具体工厂名称即可获取产品,增加新产品只需添加具体产品类和对应工厂类;缺点是增加产品会增加系统复杂度。
- 抽象工厂模式
- 结构:包含抽象工厂、具体工厂、抽象产品和具体产品,考虑多等级产品的生产。
- 优缺点:优点是能保证客户端始终使用同一个产品族中的对象;缺点是增加新产品时所有工厂类都需修改。
- 使用场景:创建相互关联或依赖的产品族,系统中有多个产品族但每次只使用某一族产品,客户端不依赖产品实例创建细节和内部结构。
3.3 原型模式
- 使用场景:对象创建复杂,对性能和安全要求较高。
- 扩展(深克隆):浅克隆会导致引用类型属性共享,可使用对象流实现深克隆。
3.4 建造者模式
- 概述:将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示,适用于对象构建过程复杂的情况。
- 结构:包含抽象建造者类、具体建造者类、产品类和指挥者类。
- 实例:以创建共享单车为例,展示了建造者模式的具体实现。
- 模式扩展:通过链式调用的方式构建对象,提高代码可读性和开发效率。
3.5 创建者模式对比
- 工厂方法模式:注重整体对象的创建方式。
- 建造者模式:注重部件构建的过程,通过一步一步精确构造创建复杂对象。