一、设计模式
1.1 设计模式对比
创建型对比
定义:创建型提供创建对象的机制,提升已有代码的灵活性和可复用性
模式 | 定义 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
单例模式 | 确保一个类仅有一个实例,并提供一个全局访问点 | 节约系统资源,提高系统性能;提供对唯一实例的受控访问 | 不易扩展,特别是当需要不同实例时;滥用单例可能会导致资源溢出或状态丢失 | 系统只需一个实例对象,如配置文件的读取、数据库连接池等 |
工厂方法模式 | 定义一个用于创建对象的接口,让子类决定实例化哪一个类 | 隐藏了对象的创建细节,降低了耦合度;易于扩展,增加新产品时只需添加新的具体工厂和具体产品 | 增加了系统的复杂度,因为每增加一个产品,就需要增加一个具体工厂和具体产品 | 客户端不知道它所需要的对象的类 |
抽象工厂模式 | 供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 | 易于交换产品系列,分离了具体类的创建和使用 | 增加了系统的抽象性和理解难度,需要添加新产品族时,需要修改抽象工厂的接口 | 系统功能结构稳定,不需要频繁新增功能,但需要支持多种产品族 |
原型模式(Prototype) | 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象 | 创建通过复制,提高了新建的效率 | 每个类都需要实现克隆方法,增加了实现的复杂度 | 对象相似,可以通过复制加修改实现的对象创建 |
建造者模式 | 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 | 封装了复杂对象的创建过程,易于扩展,增加新的构建部分不需要修改现有的类 | 如果产品内部变化复杂,会增加系统的难度和运行成本 | 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 |
结构型对比
结构型模式用于描述如何将类或对象结合在一起形成更大的结构
模式 | 定义 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
代理模式(Proxy) | 为其他对象提供一种代理以控制对这个对象的访问 | 降低耦合度,扩展性好 | 处理速度可能变慢,因为需要通过代理访问实际对象 | 远程代理,虚拟代理,安全代理等 |
工厂方法模式 | 定义一个用于创建对象的接口,让子类决定实例化哪一个类 | 隐藏了对象的创建细节,降低了耦合度;易于扩展,增加新产品时只需添加新的具体工厂和具体产品 | 增加了系统的复杂度,因为每增加一个产品,就需要增加一个具体工厂和具体产品 | 客户端不知道它所需要的对象的类 |
适配器模式(Adapter) | 将一个类的接口转换成客户端所期待的另一种接口形式,使因接口不匹配而不能在一起工作的类可以一起工作 | 灵活性、扩展性好 | 不支持多重继承 | 系统的数据和行为都正确,但接口不符 |
装饰模式(Decorator) | 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 | 装饰类和被装饰类可以独立发展,不会相互耦合 | 会产生较多的装饰类 | 封装了复杂对象的创建过程,易于扩展,增加新的构建部分不需要修改现有的类 |
行为型模式
负责对象间的高效沟通和职责传递委派
模式 | 定义 | 优点 |
---|---|---|
策略模式(Strategy) | 定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 | 算法可以独立变化,不影响客户端 |
1.2 基础概念
什么是设计模式
- 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是在不同场景下编码的最佳实践
- 要解決的都是代码的复用性、扩展性、可读性、可维护性等问题
单一职责
就是一个类进项职责一个业务,具体场景具体分析
设计原则:开闭原则
任何软件会随着时间的推移发生变化
开闭原则规定软件中的对象类模块和函数都是开放的,但对于修改时封闭的:意思就是新增功能不能戳原有代码结构有致命性的更改
本质上时面向抽象编码
其它设计原则
- 里氏替换:指导在继承中子类如何设计
- 接口隔离:接口设计尽量单一【结合实际】
- 依赖倒转:面向抽象编程
- 迪米特法则:降低耦合
- 合成复用:用对象组合来达到复用目的
1.3 创建型常见的模式
工厂模式
- 提供了按需创建对象的最佳方式,屏蔽对象的创建细节
- 对象的创建用户可以通过new的方式,也可以通过reflection方式,那么什么时候使用工厂模式呢
- 仅仅完成实例化还不够,还需要做一些其他操作才能对外提供使用,比如:有一定的初始化逻辑,需要包装一些级功能【Spring bean–>实例化后需要执行各种接口回调,完成依赖注入等操作后才对外提供】
- 根据不同的参数或配置来个性化的创建你需要的对象【比如:创建不同但是类型相关的对象(继承同一父类或接口的一组类),可以由参数来决定具体创建哪种类型的对象】
构建者模式
- 可以做到将一个对象的创建过程进行分离,也可以做到通过多个简单对象一步步组装出一个复杂对象
- lombok 插件提供了Builder注解可以使我们很方便的使用Builder模式创建对象