设计模式总结
1. 创造型 5
工厂模式
一种工厂生产一种产品。
抽象工厂模式
同一类别的产品,相同的一些属性提取到抽象工厂中,具体产品的工厂遵守抽象工厂协议(具备一些共性),那么就可以使用具体产品工厂创造个性化的产品。
建造者模式:将一个复杂对象的构建与表示分离,使得构建过程可以创建不同的表示。
指挥者(director)持有一个 builder 引用,客户端调用指挥者的“切换 builder”方法后,调用指挥者的 make 方法来建造产品。不同的具体 builder 类最终可以 getResult 得到不同的产品。
客户端调用的过程为:为指挥者设定 builer, 通过指挥者调用 builder 的各个方法, getResult 获得产品。
适用于:构造函数有多参数,可以使用建造者模式灵活地创建对象。
建造者模式和工厂模式的区别是什么?建造者模式是为了灵活创建有不同构成的对象,而工厂模式是什么样的工厂只生产什么样的产品。
建造者模式和装饰器模式的区别是什么?
建造者模式和策略模式的区别是什么?
建造者模式和状态模式的区别是什么?
单例模式
在当前程序中,当前类只生成一个对象,这个对象称为单例。(单例对象生成线程不安全,在多线程环境中需要加锁)
原型模式
设定一个 ”原型“ 协议具有 clone 方法,原始父类实现了 “原型”协议,clone 方法(传入原始父类引用,返回一个原始父类对象对象),这样可以保证深复制且子类不与父类耦合(只是依赖 “原型” 协议)。
2. 结构型 8
适配器模式
为了让 A 兼容 B,适配器继承 B,并且持有 A 的引用。这样适配器就可当作 B 来调用,也可以发挥 A 的功能。外部代码调用 B 执行功能,通过适配器转换为对 A 的调用。
桥接模式
将一个类拆分为“抽象” A 和“实现” B 两部分。A中持有 B 的引用,负责调用B来实现一些功能,B 负责把功能实现好。实际注入给 A 的 B 引用可以是B的实现类,也可以是B的实现类的子类的具体类。
桥接模式与委托模式的区别是什么?
桥接模式与策略模式的区别是什么?
组合模式
“容器”类和“叶子”类都实现“组件”接口,容器中可以存放多个组件(可以是容器或者叶子),组件包含组件,最后可以组合成多层的结构。
装饰器模式
装饰器和细分的组类都遵守“组件”协议,使用装饰器按不同顺序装饰细分组件可以得到不同的产品。
表面模式
基于现有工具库,编写一个便于调用的功能块给更高层的功能使用,使得高层的功能只在表面进行调用。
享元模式
将主类中静态、占内存大、重复性强的属性,作为一个独立享元;需要真正使用时,一个主类对象使用一个引用来拿取那个占内存大的属性。比如一张位图。
代理模式
代理和被代理者都遵守同一个协议,被代理者的关于协议的所有方法都会被代理。代理持有被代理者的引用。
委托模式
主对象将一部分方法交给委托实现,委托持有主对象的引用。
3. 行为型 10
责任链模式
处理事务的结点组成一条链,从链头开始,当前结点对到来的事务进行处理,若处理不了,则丢给下一个结点。
命令模式
将事务分割为信号发送者和接收者,使用一个“命令”对象来沟通这两者。让发送与接收彼此隔离。
迭代器模式
主对象可以生成一个迭代器用于遍历主对象中的列表结构。
中介者模式
对于一些组件,设定一个中介者,组件对象向中介者注册(交出自己的引用),中介者帮助不同类型对象之间的沟通。
中介者模式集中管理各组件的消息传递,避免组件之间相互耦合。
命令模式是一个方向的消息传递(有控制的意味),中介模式可以多个对象之间双向地传递消息。
备忘录模式
设定一个备忘对象和一个备忘录对象(具有一个历史记录数组),存入时,主对象生成备忘对象,将备忘对象存入备忘录;撤销时,从备忘录取出最近的一个备忘对象,恢复为主对象。其中备忘对象应持有主对象的引用,便于恢复。
观察者模式
也称为订阅者模式。设定一个发布者和多个订阅者,订阅者若有向发布者注册,则会被加入发布者的通知列表,发布者在有新的变化的时候,依据通知列表来通知每个订阅者。
状态模式
设定一些状态对象(同遵守 “状态” 协议),主对象持有一个 “状态” 引用,主对象同一时刻只能有一种状态,使用多个状态对象来切换主对象的状态。“状态”协议持有主对象引用,便于状态对象代替主对象执行一些具体操作。
策略模式
设定一个策略协议,可以使用多种实现,在持有策略协议引用的地方,切换策略对象即可切换为另一种解决问题的方式。
状态模式和策略模式都是使用切换对象引用的方式来实现功能,状态模式重点在于主对象的状态变化并引起主对象行为变化,而策略模式重点在于切换解决某项问题的策略以达到某些性能要求。
模板方法模式
父类定义了模板方法与默认的细分步骤,子类可依据个性要求重写细分步骤,但不能修改模板方法。模板方法保证了业务流程在子类中的一致性。
访问者模式
设定访问者,在得到主对象的接受的情况下(主对象传递自己的引用),查看主对象的属性,且不能影响到主对象的属性。
以上就是基本的设计模式的简要说明,这就像《降龙十八掌》,每个招式都蕴含一些思考。现在,我们大致知道了有这些模式。这只是一个新的开始,若要真正懂它,还需要在写代码、看框架的时候多加思考,才可以融会贯通。
至于其中有提出的问题,就当作挖坑,下一次有机会,我们一一解决。
读者朋友若有类似的问题,评论区聊~ 🙋🏼🙋🏻♀️📡