Night Field's Blog

Make it work, make it right, make it fast.

结构模式之代理模式

1 概述 代理模式(Proxy Pattern)是Javaer们最熟悉的设计模式之一,大名鼎鼎的AOP就是通过代理模式来实现的。 2 代理模式 现实中,如果要邀请某个明星参加活动,我们不是跟这个明星直接沟通,而是找他的经纪人。因为明星只需要负责表演就可以了,其他的事情由经纪人来安排。代理模式就是类似思想的体现:构造一个代理对象作为中间层,当我们需要调用某个功能时,不是直接调用功能本身,...

结构模式之组合模式

1 概述 组合模式(Composite Pattern),是指把一类有共同抽象的对象组合在一起,形成树状结构,来表示部分-整体的关系。 2 组合模式 我们经常会遇到一些对象有相同的行为,同时对象之间又有层级结构。像这种情况,使用组合模式可以使系统高内聚,低耦合。通过把类组合成树形结构,调用者能够以统一的方式对待单个对象和整体结构,忽略个体和整体之间的差异。实现组合模式一般需要: ...

结构模式之适配器模式

1 概述 适配器模式(Adapter Pattern),从名字就可以看出,工作模式类似于适配器:将原本不兼容的两样事物连接,以协同工作。 2 适配器模式 充电器(电源适配器)是日常生活中常见的例子。大多手机要求输入电压是5V,而家用交流电的电压都是220V,充电器作为适配器,将220V的电压转为目标电器需要的电压。适配器模式也类似,通过适配器,将类的接口转换为目标所期望的另一个接口。 ...

结构模式之桥接模式

1 概述 上一篇文章介绍了外观模式,接下来介绍桥接模式(Bridge Pattern)。桥接模式有时也被称为桥梁模式,也是一种常见结构模式,它主要体现了面向对象设计中的两个思想: 面向接口编程。 合成复用原则,即组合优先于继承。 2 桥接模式 桥接模式的目的是将抽象与实现分离,使二者能独立变化。说白了,其实就是: 给对象定义接口,来充当桥梁的作用。 调用者要依赖于...

结构模式之外观模式

1 概述 外观模式(Facade Pattern),也叫门面模式,是一种常见结构模式,它是面向对象设计封装思想的体现。 2 外观模式 所谓外观,其实是一个额外的类,它包含了复杂多变的子系统,并只对外提供简单的接口。相比于子系统,外观类提供的功能有限,因为它只包含外界真正关心的功能。 比如汽车只提供「方向盘」,「油门」,「刹车」几个简单元件供人使用,我们并不关心,也不需要关心发动机,刹车...

创建型模式之单例模式

1 概述 单例模式(Singleton Pattern)应该是最简单,同时又是最复杂的一种创建型模式。因为大家都知道这个模式:无非就是保证某个对象在系统中只存在一个实例。然而想要真正实现一个完美的单例模式,却不简单。 2 单例模式 一般单例模式的实现,都需要包含两个步骤: 将类的构造函数私有化。 提供一个public的方法,以供外界获取唯一的实例。 下面将一一介绍单例模式...

创建型模式之原型模式

1 概述 原型模式(Prototype Pattern)比较好理解,即以某个对象为原型,创建该对象的副本。我们可以不用知道对象内部的属性以及内部的状态,是迪米特法则的很好体现。 2 原型模式 原型模式一般用在较为复杂对象的创建,并且希望保留对象所持有的状态。Java对这种对象的创建方式也是提供了原生的支持——Object.clone()方法。 1 2 3 public class Ob...

创建型模式之建造者模式

1 概述 前面我们说了工厂模式和抽象工厂模式,下面来说说建造者模式(Builder Pattern)。 建造者模式也是一种极为常见的创建型模式,前面提到的两类工厂模式隐藏了类的属性与构造细节,而建造者模式通过Builder类,适当地暴露了类的属性,使得类的创建更具有灵活性和可读性。 2 建造者模式 当一个类的构造函数包含很多参数,或者参数之间有很多种组合(如肯德基的套餐),调用构造函数...

创建型模式之抽象工厂模式

1 概述 上一篇文章讲到了工厂方法模式,它提供了一种在不指定具体实现的情况下,创建类实例的解决方案。那为什么还需要抽象工厂模式(Abstract Factory Pattern)呢? 2 抽象工厂模式 抽象工厂模式本质上,也是定义一个工厂,用来作为类创建的入口,拥有工厂方法模式的优点:如隐藏类的构造细节,降低类的使用复杂度,与调用者解耦等等。 而它与工厂方法模式最大的区别在于,抽象工厂...

创建型模式之工厂模式

1 概述 创建型模式,提供了一种创建对象的最佳实践。工厂方法模式(Factory Method Pattern)的核心思想,是通过统一的工厂类来获取对象,而不需要调用类的构造方法。 2 优点 可以将类的实例化过程延缓到子类。调用者无需知道接口/抽象类的具体实现是什么,利用工厂方法即可获取类的实例,降低与调用者的耦合度。 隐藏类的构造细节,降低类创建的复杂度,提高程序可读性。 ...