创建型设计模式
一、 创建型模式概述
1. 核心思想
- 定义: 创建型模式 (Creational Pattern) 对类的实例化过程进行抽象。
- 核心目标: “将对象的创建与使用分离”。
2. 目的与优点
- 结构清晰: 为了使软件的结构更加清晰,客户端(使用者)对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节。这使得整个系统的设计更加符合单一职责原则(使用者的职责是“使用”,创建者的职责是“创建”)。
- 提供灵活性: 创建型模式主要关注点是“怎样创建对象?”。它在创建什么 (What),由谁创建 (Who),何时创建 (When) 等方面都为软件设计者提供了尽可能大的灵活性。
- 封装创建细节: 创建型模式隐藏了类的实例的创建细节。通过隐藏对象如何被创建和组合在一起,达到使整个系统独立于对象创建过程的目的。
3. 创建型模式分类
创建型模式主要包括以下几种(其中简单工厂模式不属于GoF 23种设计模式,但通常作为学习的起点):
- 工厂模式
- 简单工厂模式 (Simple Factory)
- 工厂方法模式 (Factory Method)
- 抽象工厂模式 (Abstract Factory)
- 单例模式 (Singleton)
- 原型模式 (Prototype)
- 浅克隆
- 深克隆
- 建造者模式 (Builder)
二、 简单工厂模式
1. 模式动机
- 生活场景: 我们去水果农场买水果,只需要告诉农场主水果的名字(如苹果、橘子),就能得到相应的水果,而不需要关心水果是怎么种出来的。
- 软件场景: 客户端需要创建和使用不同类型的电视机对象(例如海尔电视、海信电视)。这些不同品牌的电视机都源自同一个电视机抽象类(或接口)。
- 核心需求: 我们希望客户端不需要知道这些具体的品牌电视机类名,只需要提供电视品牌名称(一个字符串参数),就能通过一个调用的方法返回一个相应的电视机对象。这样就实现了电视机对象创建与使用的分离。
2. 模式定义
- 定义: 简单工厂模式 (Simple Factory Pattern) 又称为静态工厂方法 (Static Factory Method) 模式,它不属于GoF 23种设计模式之一,但通常被看作是一种编程习惯或入门模式。它属于类创建型模式。
- 核心行为: 在简单工厂模式中,可以根据参数的不同返回不同类的实例。
- 结构: 简单工厂模式专门定义一个工厂类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
3. 模式角色
简单工厂模式包含以下三个核心角色:
-
Factory (工厂角色)
- 这是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑。
- 工厂类中提供了一个静态的工厂方法 (例如
produce(String type)或createProduct(String type))。 - 这个方法的返回类型为抽象产品类型 (Product)。
- 外部客户端通过调用这个静态方法来获取产品对象。
-
Product (抽象产品角色)
- 它是工厂类所创建的所有对象的父类(或接口),封装了各种产品对象的公有方法。
- 它是客户端直接使用的类型。
-
ConcreteProduct (具体产品角色)
- 它是抽象产品角色的具体实现。
- 每个具体产品类都对应一种具体的产品。
- 工厂类根据传入的参数来决定创建并返回哪一个具体产品类的实例。
4. 模式结构与实现
- UML 结构图:

左侧是产品层次结构,包含
Product接口和两个实现它的ConcreteProduct类。
右侧是Factory类。从Factory类画出虚线箭头指向ConcreteProductA和ConcreteProductB,表示依赖关系。
- 代码示例解析:
// 伪代码示例
class Factory {
// 工厂角色
// 提供一个静态方法,根据参数创建产品
public static Product produce(String brand) {
// 抽象产品角色作为局部变量
Product product = null;
// 根据参数(brand)决定创建哪个具体产品
switch (brand) {
case "Haier":
// 具体产品角色A
product = new ConcreteProductA();
break;
case "Hisense":
// 具体产品角色B
product = new ConcreteProductB();
break;
// ... 可以有更多的 case
}
// 返回抽象产品类型
return product;
}
}
- 依赖关系解释:
- 在UML图中,从
Factory类指向ConcreteProductA和ConcreteProductB的虚线箭头表示依赖关系。 - 这是因为在
Factory类的produce()方法内部,需要new出ConcreteProductA或ConcreteProductB的实例。在方法体中引用了这些具体产品类,因此工厂类就依赖于这些具体产品类。
- 在UML图中,从
834

被折叠的 条评论
为什么被折叠?



