《设计模式的艺术》笔记——创建型模式

最近看了刘伟写的《设计模式的艺术》, 第一次具体的学习设计模式,整理了一下笔记。

每种设计模式基本上都只写了定义和结构图,只是写给自己看的,方便回忆使用场景、优缺点等。

单例模式(Singleton Pattern)

  1. 动机:确保对象的唯一性。

  2. 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

  3. 要点:

    • 一个类只能有一个实例。
    • 它必须自行创建这个实例。
    • 他必须自行向整个系统提供这个实例。
  4. 结构图:

    designpattern10.jpg

  5. 饿汉式单例类:在类加载的时候就已经创建了单例对象。

  6. 懒汉式单例类:在第一次调用getInstance()方法时实例化,在类加载的时并不自行实例化。(延迟加载技术)

简单工厂模式

  1. 定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

  2. 要点:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建的细节。

  3. 结构图:

    designpattern11.jpg

  4. 简单工厂模式只提供一个工厂类,职责较重且违背开闭原则。

工厂方法模式

  1. 针对不同的产品提供不同的工厂。

  2. 定义一个用于创建对象的接口,让子类决定将那个类实例化。

  3. 结构图:

    designpattern12.jpg

  4. 可能会导致系统中存在大量的工厂类。

抽象工厂模式

  1. 将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产。

  2. 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

  3. 结构图:

    designpattern13.jpg

  4. 增加新的产品族很方便,但是增加新的产品等级结构很麻烦。(开闭原则的倾斜性)

原型模式

  1. 通过一个原型对象克隆出多个一模一样的对象。

  2. 定义:使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象。

  3. 核心在于如何实现克隆方法。可以在具体原型类的克隆方法中实例化一个跟自身类型相同的对象,并将相关的参数传入新创建的对象中,将其放回。可以使用语言提供的clone()等方法。

  4. 结构图:

    designpattern14.jpg

  5. 浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制。

建造者模式

  1. 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。

  2. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  3. 结构图:

    designpattern15.jpg

  4. 建造者模式与抽象工厂模式的区别:建造者模式返回一个完整的复杂产品,而抽象工厂模式返回一系列相关的产品;建造者模式侧重于一步步地构造一个复杂的对象,然后将结果返回,而抽象工厂模式客户端通过选择具体工厂类来生成所需对象。

  5. 钩子方法用于在具体类中控制抽象类或者客户端的具体行为,放回类型通常为boolean类型,方法名一般为isXXX()。