0 快速记忆
创建型
单例模式:确保一个类仅有一个实例,并提供一个全局访问点。这有助于控制资源的使用,如数据库连接、线程池等。
应用: java.lang.Runtime工厂模式:创建对象的接口,但让子类决定要实例化的类是哪一个。工厂模式使得创建对象的过程与使用对象的过程解耦。
应用:java.lang.Object#toString()抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
应用:jdk中连接数据库的代码是典型的抽象工厂模式建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
应用:StringBuilder和StringBuffer的append()方法原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
应用: JDK中的Date类。
结构型
-
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的类可以一起工作。
应用:Java.util.Arrays#asList()、 -
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
应用:JDBC数据库访问接口API; -
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和复合对象的使用具有一致性。
应用:视图view 相关 -
装饰器模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。
应用:Java I/O使用装饰模式设计,JDK中还有很多类是使用装饰模式设计的,如:Reader类、Writer类、OutputStream类等。 -
外观模式:为子系统中的一组接口提供一个一致的界面,使得子系统更加容易使用。
应用:电影播放实现(子系统 声音 子系统 画面 子系统灯光) -
享元模式:运用共享技术有效地支持大量细粒度的对象。
应用:String 类。 -
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
应用:java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
行为型
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
应用:Eventbus策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
应用: java.util.Comparator#compare()模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
应用:AbstractClass抽象类里面的TemplateMethod()就是模板方法迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
应用:collection容器使用了迭代器模式责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
应用:OKHTTP状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
应用:activity 生命周期访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
应用:传不同的param类型,就是不同的实现。备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后可以恢复对象到这个状态。
应用: java.io.Serializable解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
应用:java.util.Pattern java.text.Format中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
应用: java.util.concurrent.Executor#execute()命令模式:将一个请求封装为一个对象,从而使你可用不同的请求把客户端参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
应用: java.util.Timer类中scheduleXXX()方法
1.设计模式的分类
创建型模式(Creational):
关注对象的实例化过程,包括了如何实例化对象、隐藏对象的创建细节等。常见的创建型模式有单例模式、工厂模式、抽象工厂模式等。
结构型模式(Structural):
关注对象之间的组合方式,以达到构建更大结构的目标。这些模式帮助你定义对象之间的关系,从而实现更大的结构。常见的结构型模式有适配器模式、装饰器模式、代理模式等。
行为型模式(Behavioral):
关注对象之间的通信方式,以及如何合作共同完成任务。这些模式涉及到对象之间的交互、责任分配等。常见的行为型模式有观察者模式、策略模式、命令模式等。
2.创建型5种
1.工厂模式
工厂方法模式提供了一个创建对象的接口,但是将具体的对象创建延迟到子类中。这样,客户端代码不需要知道要创建的具体对象的类,只需要通过工厂方法来创建对象。
2.抽象工厂模式(Abstract Factory Pattern)
抽像工厂模型的关键思想是提供一个抽像工厂接口,该接口确定了一系列相关产品的创意,具体的工厂类责任实现这些方法,创建相关系列的产品组合。
3.单例模式(Singleton)
单例模式通过确保一个类只能创建一个实例,并提供一个静态方法或静态属性来访问这个实例。
4.建造者模式(Builder)
建造者模式提供了一种将一个复杂对象的构建过程与其表示分离的方法。
5.原型模式(Prototype Pattern)
原型模式的解决方案是通过复制现有对象来创建新对象,而不是从头开始构建。
3.结构型7种
1.桥接模式(Bridge Pattern)
定义:(将抽象和实现解耦,使得两者可以独立地变化。)组合优于继承
使用场景:
● 不希望或不适用使用继承的场景
● 接口或抽象类不稳定的场景
● 重用性要求较高的场景
注意:发现类的继承有N层时,可以考虑使用桥梁模式。桥梁模式主要考虑如何拆分抽象和实现。
2.装饰(Decorator)模式
定义:(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。)装饰模式提供了一种在运行时动态地为对象添加新功能的方法,通过创建一个装饰类来包装原始类。装饰类具有与原始类相同的接口,它内部包含一个指向原始对象的引用,并且可以根据需要包装额外的功能
使用场景:
● 需要扩展一个类的功能,或给一个类增加附加功能。
● 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
● 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
3.代理模式(Proxy Pattern)
定义:(为其他对象提供一种代理以控制对这个对象的访问。)
代理模式提供了一个代理对象,它充当了原始对象的替代品,以控制对原始对象的访问。代理对象与原始对象实现相同的接口,使得客户端可以无缝地切换和使用
4.适配器模式(Adapter Pattern)
定义:(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
使用场景:
你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,怎么办?使用适配器模式,这也是我们例子中提到的。
注意事项:
详细设计阶段不要考虑使用适配器模式,使用主要场景为扩展应用中。
5.享元模式(Flyweight Pattern)
定义:(使用共享对象可有效地支持大量的细粒度的对象。)
使用场景:
● 系统中存在大量的相似对象。
● 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。
● 需要缓冲池的场景。
注意:
● 享元模式是线程不安全的,只有依靠经验,在需要的地方考虑一下线程安全,在大部分场景下不用考虑。对象池中的享元对象尽量多,多到足够满足为止。
● 性能安全:外部状态最好以java的基本类型作为标志,如String,int,可以提高效率。
6.外观模式(Facade Pattern)
定义:(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。)
使用场景:
● 为一个复杂的模块或子系统提供一个供外界访问的接口
● 子系统相对独立——外界对子系统的访问只要黑箱操作即可
● 预防低水平人员带来的风险扩散
注意:
●一个子系统可以有多个门面
●门面不参与子系统内的业务逻辑
外观模式通过提供一个简化的接口,将复杂的子系统封装起来,帮助提高系统的可用性、可维护性和灵活性。它在处理复杂系统的同时,使客户端代码更加清晰和易于理解。
7.组合(Composite)模式
定义:(将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。)需要处理一组对象,这些对象之间具有整体-部分的关系。我们希望能够以一致的方式处理单个对象和对象组合,而不需要对它们进行特殊处理
使用场景:
● 维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理。
● 从一个整体中能够独立出部分模块或功能的场景。
注意:
只要是树形结构,就考虑使用组合模式。
4. 行为型
1.解释器模式(Interpreter)
解释器模式的使用可以使你更容易地实现特定语言的解释和执行,尤其在处理自定义的领域特定语言(DSL)时非常有用。
2.模板方法模式(Template Method)
当你在设计一个类或一组类时,发现有一些算法的结构是固定的,但其中的某些步骤可能会因应用情境或子类的不同而变化。你希望将这个算法的核心结构固定下来,但留出一些灵活性来允许特定步骤的定制。
解决方案:
模板方法模式通过定义一个抽象的父类,其中包含了算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。
3.责任链模式(Chain of Responsibility)
责任链模式提供了一种通过一系列处理对象来处理请求的方法。每个处理对象都包含一个对下一个处理对象的引用,形成一个链式结构。当一个请求到达时,它首先被传递给链中的第一个处理对象,如果该对象不能处理该请求,它会将请求传递给下一个处理对象,依此类推,直到找到能够处理请求的对象为止。责任链模式是一种有助于将请求与处理者解耦,并支持动态调整处理顺序和职责的设计模式。
4.命令模式(Command)
提供了一种将请求封装成对象的方法,使得请求的发送者与请求的接收者之间不直接耦合。命令模式在需要解耦请求发送者和接收者,并支持灵活的命令处理时非常有用。它在菜单系统、GUI 操作、多级撤销等场景中得到广泛应用。
5.迭代器模式(Iterator)
迭代器模式提供了一种统一的方法来遍历不同类型的集合,而无需暴露集合内部的表示细节
6.中介者模式(Mediator)
中介者模式引入了一个中介者对象,它负责协调和管理对象之间的通信。对象不再直接与其他对象通信,而是通过中介者来发送和接收消息
7.备忘录模式(Memento)
备忘录模式通过引入“备忘录”对象,允许在不暴露对象内部结构的情况下,捕获并存储对象的状态。同时,它还提供了一种将对象恢复到之前状态的方式,备忘录模式使得对象的状态管理更加灵活。它允许对象在不暴露其内部结构的情况下进行状态的保存和恢复。这有助于实现撤销和重做功能,以及历史记录和快照功能。
8.观察者模式(Observer)
观察者模式的核心思想是定义一种一对多的依赖关系,使得一个主题(通常称为被观察者)可以同时维护多个观察者,并在其状态改变时自动通知所有观察者。
9.状态模式(State)
状态模式的解决方案是将对象的状态抽象成独立的状态类,每个状态类都实现了一组特定状态下的操作。然后,上下文对象(即包含状态的对象)维护一个指向当前状态的引用,通过委托给当前状态的方法来执行操作。
10.策略模式(Strategy)
策略模式提供了一种定义一系列算法的方法,将这些算法封装成独立的策略类,并使它们可以相互替换。
11.访问者模式(Visitor)
访问者模式提出了一种解决方案,使得可以在不修改元素类的情况下,将操作从元素类中分离出来。它的核心思想是引入一个称为“访问者”的接口或类,该访问者包含了多个访问操作,每个操作对应一个元素类。元素类接受访问者,从而将自身传递给访问者,使得访问者可以对元素执行相应的操作。