设计模式概览,网络备忘录
主要关注点是“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
创建型模式分为以下5种。
- 单例(Singleton)。某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
- 原型(Prototype)。将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
- 工厂方法(FactoryMethod)。定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂(AbstractFactory)。提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
- 建造者(Builder)将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
定义:确保一个类只有一个实例,并提供一个全局访问点。
五种实现方式:
① 饿汉式
② 懒汉式
③ 双重校验
④ 静态内部类
⑤ 枚举
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。也就是
说,这种不通过new关键字来产生一个对象,而是通过对象复制(Java中的clone或反序
列化)来实现的模式,就叫做原型模式。
- 性能优良:原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环内产生大量的对象时,原型模式可能更好地体现其优点。
- 逃避构造函数的约束,直接在内存中拷贝,构造函数是不会执行的。
- 使用场景:
- 类的初始化需要消耗非常多的资源。
- 通过new产生一个对象需要非常繁琐的数据准备或访问。
- 一个对象需要提供给其他对象访问,而且每个调用者可能都需要修改其值时。该处使用的url网络请求的数据。
定义:通过抽象方法提供对象生成入口。简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。
定义:定义了一个创建对象的接口(类或接口中的方法,通过接口,来创建一组产品,但由子类决定要实例化的类。
是哪一个。工厂方法把实例化推迟到子类。
定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
定义:使用生成器模式,可以封装一个产品的构造过程,并允许按步骤构造产品。
- 优点:
- 将一个复杂对象的创建过程封装起来。
- 允许对象通过多个步骤来创建,并且可以改变过程。
- 向客户隐藏产品内部的表现。
- 产品的实现可以被替换,因为客户只看到一个抽象接口。
- 用途和缺点
- 经常被用来创建组合结构。
- 与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。
结构型模式描述如何将类或对象按某种布局组成更大的结构。分为类结构型模式(采用继承机制来组织接口和类)和对象结构型模式(釆用组合或聚合来组合对象)。
结构型模式分为以下 7 种:
- 代理(Proxy):为某对象提供一种代理以控制对该对象的访问。即:客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
- 适配器(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
- 桥接(Bridge):将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
- 装饰(Decorator):动态地给对象增加一些职责,即:增加其额外的功能。
- 门面(Facade):为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
- 享元(Flyweight):运用共享技术来有效地支持大量细粒度对象的复用。
- 组合(Composite):将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
定义:代理模式为另一个对象提供一个替身或占位符,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
定义:将抽象部分和实现部分,分离解耦,使得两者可以独立地变化。桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立变化。
- 优点:
将实现予以解耦,抽象和实现可以独立扩展,不会影响到对方。
对于“具体的抽象类”所做的改变,不会影响到客户。
- 用途和缺点:
适合使用在需要跨越多个平台的图形和窗口系统上。
当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。
桥接模式的缺点是增加了复杂度。
定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更弹性的替代方案。
定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
定义:享元模式是池技术的重要实现方式,其定义如下:使用共享对象可以有效地支持大量的细粒度的对象。
定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
定义:行为型模式用于描述程序在运行时复杂的流程控制,即:描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
- 行为型模式分为类行为模式(采用继承机制来在类间分派行为)和对象行为模式(采用组合或聚合在对象间分配行为)。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。行为型模式是GoF设计模式中最为庞大的一类,它包含以下 11 种模式。
- 模板方法(Template Method):定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
- 策略(Strategy):定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
- 命令(Command):将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
- 职责链(Chain of Responsibility):把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
- 状态(State):允许一个对象在其内部状态发生改变时改变其行为能力。
- 观察者(Observer):多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
- 中介者(Mediator):定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
- 迭代器(Iterator):提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
- 访问者(Visitor):在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
- 备忘录(Memento):在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
- 解释器(Interpreter):提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。
定义:在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
定义:将“请求”封装成命令对象,以便使用不同的请求、队列或日志来参数化其他对象。
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
定义:使用中介者模式来集中相关对象之间复杂的沟通和控制方式。
定义: 提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
定义:表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。当你需要让对象返回之前的状态时(例如:你的用户请求“撤销”),就使用备忘录模式。
定义:主要用于定义一种用于解释和执行语言或表达式的语法表示方法。解释器模式的主要目的是让语言的语法易于扩展和修改。
本篇文章主要是做个备忘录的