本文节选来在 图说设计模式
创建型模式(Creational Pattern)
简单工厂模式(Simple Factory Pattern)
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式的应用:JDK类库中广泛使用了简单工厂模式。
工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
模式的应用:在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
建造者模式(Builder Pattern)
造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
举例:麦当劳套餐。
模式的应用:将复杂的系统结构成子系统进行设计(比如,游戏中的人物建模)。
单例模式(Singleton Pattern)
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。
模式的应用:一台计算机中,多个程序共享一个打印机池。
结构型模式(Structural Pattern)
适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
举例:A 给 B 提供接口不兼容,并希望把现有的接口转化为 B 期望的接口,这种情况下,通过适配器可以完成这样的转化,适配器包装了 A,并向 B 提供兼容的接口。
模式的应用:数据库连接工具JDBC,JDBC。
桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
举例:绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,这时候将颜色与形状独立开来,将颜色设计成单独的类(或者接口),而在形状中对颜色进行实现。
模式的应用:跨平台的多格式播放器对视频播放要用到的接口进行了抽象,在不同平台下对这些接口进行了不同的实现。
装饰模式(Decotator Pattern)
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
举例:变形金刚在变身前是一辆车,这时候他拥有车的行为和属性;当变形金刚变成机器人的时候,它就可以用为类人的行为和属性。
模式的应用:用于动态地给一个对象增加额外的职责。
外观模式(Facade Pattern)
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
举例:Sequelize 对 PostgreSQL, MySQL, MariaDB, SQLite and MSSQL 进行了包装,为使用者提供一致的使用接口。
模式的应用:对客户屏蔽子系统组件、实现了子系统与客户之间的松耦合、降低了大型软件系统中的编译依赖性。
享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
举例:编辑器软件中,一张图片在多个地方出现,这时候通过享元模式可以对这种图片只进行一次的初始化,在多个地方复用。
模式的应用:系统中存在大量相同的或者相似的对象而造成内存的大量消耗、工厂模式可以创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。
代理模式(Proxy Pattern)
代理模式(Proxy Pattern) :给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。
举例:VPN
模式的应用:EJB、Web Service等分布式技术都是代理模式的应用。
行为型模式(Behavioral Pattern)
命令模式(Command Pattern)
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
举例:电视遥控器、iOS 应用见的相互调用(例如,分享到微信)。
模式的应用:降低系统耦合。
中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。中介者模式可以使对象之间的关系数量急剧减少。
举例:MVC 架构中 Controller,Controller 作为一种中介者,它负责控制视图对象View和模型对象Model之间的交互。如在Struts中,Action就可以作为JSP页面与业务对象之间的中介者。
模式的应用:MVC。
相关知识点:迪米特法则
观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
举例:JavaScript EventTarget.addEventListener()
.
模式的应用:MVC 模式,观察者模式中的观察目标就是MVC模式中的模型(Model),控制器(Controller)充当两者之间的中介者(Mediator)。
状态模式(State Pattern)
状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
举例:OA 办公系统中,一个批文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。
模式的应用:TCP 协议实现 —— TCP 连接的状态有多种可能,状态之间的转换有相应的逻辑前提; 这是使用状态模式的场合;
策略模式(Strategy Pattern)
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
模式的应用:如定义所言。
今天和 Yao 打赌,看谁体重先涨到 70 kg,计划上半年完成这个目标。
Robin on March 15, 2017