一. 创建型模式的特点与分类

创建型模式的主要关注点是“怎么创建对象”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。

创建型模式主要分为以下几种。

  • 单例模式:某个类只生成一个实例,该类提供一个全局访问点供外部获取该实例,其拓展是有限多例模式。
  • 原型模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
  • 工厂方法模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
  • 抽象工厂模式:提供一个创建产品族的接口,其每个子类可以产生一系列相关的产品。
  • 建造者模式:将一个复杂的对象分解成多个相对简单的部分,然后根据不同的需要分别创建它们,最后构建该复杂对象。

以上 5 种创建型模式,除了工厂方法模式属于类创建型模式,其他的全部属于对象创建型模式。

二.单例模式

1.单例模式的定义与特点

定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。

单例模式有3个特点:

  • 单例类只有一个实例对象。
  • 该单例对象必须由单例类自行创建。
  • 单例类对外提供一个访问该单例的全局访问点。

2.单例模式的结构与应用场景

单例模式的主要角色如下:

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问类:使用单例的类

应用场景:

  • 某类只要求生成一个对象的时候。
  • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。
  • 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候。

三.原型模式

1.原型模式的定义与特点

定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或者相似的新对象。

特点:在这里,原型实例指定了要创建的对象的种类。用这种方法创建对象非常高效,根本不需要知道创建的细节。

2.原型模式的结构与应用场景

原型模式的主要角色如下:

  • 抽象原型类:规定具体原型对象必须实现的接口。
  • 具体原型类:实现抽象原型类的clone()方法,它是可被复制的对象。
  • 访问类:使用具体原型类中的clone()方法来复制新的对象。

应用场景:

  • 对象之间相同或者相似,即只是个别的几个属性不同的时候。
  • 对象的创建过程比较麻烦,但复制比较简单的时候。

四.工厂方法模式

1.工厂方法模式的定义与特点

定义:定义一个创建产品对象的工厂接口,将产品对象实际创建工作推迟到具体子工厂类当中。满足创建型模式中要求“创建与使用相分离“的特点。

我们把创建的对象称为”产品“,把创建产品的对象称为”工厂“。如果要创建的产品不多,只需要一个工厂类就可以完成,这种模式叫”简单工厂模式“,它的缺点是增加新产品时会违背”开闭原则“。

工厂方法模式的主要优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,而不需要知道产品的具体创建过程。

  • 在系统增加新的产品时,只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。

缺点:

  • 每增加一个产品就要增加一个具体的产品类和一个对应的具体工厂类,增加了系统的复杂度。

2.工厂方法模式的结构与应用场景

工厂方法模式的主要角色如下:

  • 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  • 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品:定义抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

应用场景:

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。
  • 创建对象的任务由多个具体子工厂的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关系创建产品的细节,只关心产品的品牌。

五.抽象工厂模式

1.抽象工厂模式的定义与特点

定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类不需要指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

使用抽象工厂模式一般要满足以下条件:

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
  • 系统一次只可能消费其中某一族的产品,即同族的产品一起使用。

抽象工厂模式的主要优点:

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当增加一个新的产品族时不需要修改源代码,满足开闭原则。

缺点:

  • 当产品族中需要增加一个新产品时,所有的工厂类都需要进行修改。

2.抽象工厂模式的结构与应用场景

抽象工厂模式的主要角色如下:

  • 抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法 ,可以创建多个不同等级的产品。

  • 具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

  • 抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

  • 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

应用场景:

  • 当需要创建的对象是一系列相互关联或相互依赖的产品族时。

  • 系统中有多个产品族,但每次只使用其中的某一族产品。

  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。

六.建造者模式

1.建造者模式的定义与特点

定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为”建造者模式“。它将一个复杂的对象分解为多个简单的对象,然后一步步构建而成,它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

建造者模式的主要优点:

  • 各个具体的建造者相互独立,有利于系统的扩展。
  • 客户端不必知道产品内部组成的细节,便于控制细节风险。

缺点:

  • 产品的组成部分必须相同,这限制了其使用范围。
  • 如果产品的内部变化复杂,该模式会增加很多建造者类。

建造者模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂模式更注重零部件的创建过程,但两者可以结合使用。

2.建造者模式的结构与应用场景

建造者模式的主要角色如下:

  • 产品角色:它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。

  • 抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 。

  • 具体建造者:实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。

  • 指挥者:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

应用场景:

  • 创建的对象较复杂,由多个部件构成,各个部件面临着复杂的变化,但构件间的建造顺序是稳定。

  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。


以上是对5种创建型模式的简单介绍,文章整理自C语言中心网 ,感谢您的阅读。