简单工厂模式
建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口
创建型
单例模式Singleton
工厂方法模式Factory(类)
在简单工厂模式的基础上,将工厂也进行抽象,工厂类实现工厂接口。工厂接口只对指定的一个产品进行实例化。
抽象工厂模式Abstract Factory
提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们的具体类
在简单工厂方法模式的基础上,对工厂接口进行扩展,接口中可以定义多个方法,每个方法产生不同产品类的实例。
原型模式Prototype
用原型实例指定创建的对象种类,并复制原型中的属性给新创建的对象
但是现在很多高级语言已经自带了clone方法,可以克隆对象,那么原型模式还有什么用呢。这是因为有时候语言中自带的clone方法存在一定的局限性。
详解Java中的clone方法 -- 原型模式_java clone-CSDN博客 这篇文章对这个问题进行了详细的说明
建造者模式Builder
将一个复杂对象的构建与他的表示分离,使同样的构建过程可以创建不同的表示
- 也叫生成器模式,当类的初始化过程需要设置很多属性且过程复杂时,一次性把所有参数传入构造函数中显得非常不优雅。我们可以把这些属性的设置过程拆分到各个个方法中去,每个方法中设置属性后,返回类本身。这样,在使用时我们可以以链式操作的形式配置参数和调用方法。yii2框架中的query操作就是典型的使用。
- 以上属于是建造者模式的进阶模式,在方法层面就实现了建造者模式。如果严格按照建造者模式的类图,则是在类层面实现建造者模式,如下
当创建了一个建造者类B1,他的BuilderPart方法中,调用了Product的F1,F2方法设置了属性,我们就获取了一个拥有F1,F2状态的product对象。
当我们想要获取一个设置了F2,F3属性的product对象时,就需再在创建一个建造者类。符合开闭原则。
结构型
组合模式Composite
把对象组合成树形结构,以表示“整体-部分”的层次结构,使单个对象与组合对象的使用具有一致性
主要解决整体和部分的关系。比如全国人口统计,每个省,每个市,每个县都需要完成各自辖区的人口统计,但是实现方式不一样。统计全国人口时,不关心统计方法的内部代码,只需要拿到统计方法的值即可。
该模式基于容器实现,容器本身和传入容器的对象(即每个地区的人口统计)都要实现同一个统计接口。完成数据组合后(即往容器中加入子对象),调用容器的统计方法遍历执行列表中对象的统计方法即可,关键代码如下
适配器模式Adapter (类&对象)
将一个类的接口转换为客户希望的另一个接口。使原本因接口不兼容无法一起工作的类可以一起工作。
主要目的是将一个类的接口转换成客户希望的另外一个接口。
基本使用流程为:创建一个适配器类,类的属性为待适配的对象,类的方法为目标方法。除目标方法外,还有一个方法用于接收传入的适配对象,并赋值给待适配属性对象,然后就可以在各个目标方法中调用适配对象的对应方法
装饰器模式Decorator
实现方式与适配器模式很相似,区别是创建的装饰器类必须实现被扩展类中的方法,这些方法中可以调用被扩展类的原有方法并进行扩展。也可以添加新的方法,实现新的功能。
代理模式Proxy
代理模式与适配器模式、装饰器模式类似。不同点是,代理类中的方法只需与被代理类保持一致即可,不需增加和适配
桥接模式Bridge
一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。通过组合关系来替代继承关系,避免继承层次的指数级爆炸。
桥接模式中,可能存在多个角色,这些角色都要抽象出对应的接口供各自的角色实现,并根据需求依次作为其他角色的使用者
这个过程中,原数据在各个角色之间被交接和处理,各个角色就像桥一样连接在一起,把数据从开始送到结束,实现了输出。
https://zhuanlan.zhihu.com/p/112497289 该文章中的桥接模式代码描述的比较清晰
外观模式Facade
给系统中的一组接口提供一个高层次的调用接口,使系统更加容易使用
通过创建一个类,在类的方法中将多个功能和步骤有序的执行,外部调用时,只需要调用类的一个方法即可,不需要关心方法内部各个功能的执行顺序和关系。
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。不符合开闭原则,新增需求时要修改外观类
享元模式(FlyWeight)
即连接池技术,通过维护一个对象的集合,通过集合对集合内的对象进行共享。当使用时,先查询集合内是否有可用对象,使用完毕时,释放对象(即修改对象的使用状态)
行为型
命令模式Command
将一个请求封装为一个对象,从而可以使用不同的请求对象对客户端进行参数化
责任链模式Chain of Responsibility
使多个对象都有机会处理请求,避免发送者与接收者之间的耦合关系
解释器模式Interpreter (类)
解释器模式类似过滤器模式,只不过侧重点不同。过滤器侧重对数据的过滤删除,而解释器则侧重对数据的解释和修改
迭代器模式Iterator
提供一种方法顺序访问一个聚合对象中各个元素,且不需暴露对象的内部表示
用于顺序访问集合对象的元素,其实就是工厂方法模式的具体使用。
首先定义一个迭代器接口,接口中包hasNext()和next()方法,之后实现多个迭代器类。当一个类中有集合元素,且需要迭代访问时,可以在类中创建一个getIterator()方法用于获取和返回一个迭代器对象,之后该类就可以使用返回的迭代器访问类中的集合元素了。
中介者模式Mediator
类似于享元模式,不同点在于中介者模式中的对象容器,可以由参与者动态添加或删除。一个参与者信息的变动,可以通过中介者类中的容器,广播给其他参与者
观察者模式Observer
定义对象间的一种一对多关系,当一个对象状态改变时,所有依赖它的对象都会得到通知
备忘录模式Memento
在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。在需要时可以将对象恢复到原先保存的状态。
也叫做快照模式,和原型模式有些类似,都是在类内部对自己的属性进行克隆操作。
状态模式State
其实就是工厂模式的实际应用。工厂模式中,最终结果是根据条件实例化一个类。状态模式是把生成的类传入使用的方法中,使用方法根据传入的类(即状态)不同,执行不同的工作。
策略模式Strategy
就是状态模式的另外一种称呼。这两个模式只是在概念的理解上稍有不同,状态模式强调的是结果的不同,策略模式强调的是过程的不同。
访问者模式Visitor
相当于升级版本的策略模式。策略模式中,根据条件变换单个调用对象,以改变原有代码的运行结果。访问者模式则是根据条件,变更访问者对象(访问者对象中包含多个调用对象),来改变代码的运行结果。以下是访问者模式类图
ElementA、B、C属于被调用对象,被调用对象中除了自身的业务方法外,都要实现一个accept方法,用于接收访问者对象,并调用访问者对象中针对该对象的方法。
访问者对象,针对每一个被调用对象都要实现一个访问方法,用于将传入的调用对象赋值给当前的访问者对象。访问者可以把接收后的调用对象就行各种扩展
客户端调用时,实例化被调用对象,然后调用accept方法把对象传入访问者。之后就可以通过访问者调用被调用对象的各个方法。更换访问者对象后,就可以实现功能的切换
模板模式Template(类)
定义一个算法骨架,将一些步骤延迟到子类中。使得子类可以不改变一个算法结果即可重定义算法的某些特定步骤
比如盖房子,标准顺序是打地基、建围墙、封顶、安门窗、走水电、室内装修。盖房子时必须严格按照此顺序执行,但是各个阶段可能因为房子的不同导致工艺、材质有所不同。
这个时候我们把每个步骤抽象出来,但是房子建造的顺序在父类中实现。每个子类可以自由实现各个步骤,但是建造顺序必须继承父类。