【设计模式笔记09】:创建型设计模式概述与简单工厂模式

#AgenticAI·十月创作之星挑战赛#

创建型设计模式

一、 创建型模式概述

1. 核心思想
  • 定义: 创建型模式 (Creational Pattern) 对类的实例化过程进行抽象。
  • 核心目标: “将对象的创建与使用分离”
2. 目的与优点
  • 结构清晰: 为了使软件的结构更加清晰,客户端(使用者)对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节。这使得整个系统的设计更加符合单一职责原则(使用者的职责是“使用”,创建者的职责是“创建”)。
  • 提供灵活性: 创建型模式主要关注点是“怎样创建对象?”。它在创建什么 (What)由谁创建 (Who)何时创建 (When) 等方面都为软件设计者提供了尽可能大的灵活性。
  • 封装创建细节: 创建型模式隐藏了类的实例的创建细节。通过隐藏对象如何被创建和组合在一起,达到使整个系统独立于对象创建过程的目的。
3. 创建型模式分类

创建型模式主要包括以下几种(其中简单工厂模式不属于GoF 23种设计模式,但通常作为学习的起点):

  1. 工厂模式
    • 简单工厂模式 (Simple Factory)
    • 工厂方法模式 (Factory Method)
    • 抽象工厂模式 (Abstract Factory)
  2. 单例模式 (Singleton)
  3. 原型模式 (Prototype)
    • 浅克隆
    • 深克隆
  4. 建造者模式 (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类画出虚线箭头指向ConcreteProductAConcreteProductB,表示依赖关系

  • 代码示例解析:
// 伪代码示例
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 类指向 ConcreteProductAConcreteProductB 的虚线箭头表示依赖关系
    • 这是因为在 Factory 类的 produce() 方法内部,需要 newConcreteProductAConcreteProductB 的实例。在方法体中引用了这些具体产品类,因此工厂类就依赖于这些具体产品类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值