设计模式-03.抽象工厂模式

在上一篇文章中介绍了工厂方法模式,其实工厂方法和抽象工厂有很多相似的地方,抽象工厂是工厂方法的升级版,只不过工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品,可以生产一个产品族的产品。

什么是抽象工厂?

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

主要角色与关系

  • 抽象工厂(Abstract Factory):提供创建抽象产品的接口,包括多个创建产品的方法。
  • 具体工厂(Concrete Factory):实现了抽象工厂的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):描述了产品的规范、功能以及特性等,在抽象工厂模式中有多个抽象产品。
  • 具体产品(Concrete Product):实现了抽象产品的接口,由具体工厂来创建。

UML图

classDiagram direction BT class AbstractFactory { <<抽象工厂>> +CreateProductA() +CreateProductB() } class ConcreteFactoryA { <<具体工厂>> +CreateProductA() +CreateProductB() } class ConcreteFactoryB { <<具体工厂>> +CreateProductA() +CreateProductB() } ConcreteFactoryA ..|> AbstractFactory ConcreteFactoryB ..|> AbstractFactory class AbstractProductA { <<抽象产品A>> } class AbstractProductB { <<抽象产品B>> } class ConcreteProductA1 { <<具体产品A1>> } class ConcreteProductA2 { <<具体产品A2>> } ConcreteProductA1 ..|> AbstractProductA ConcreteProductB1 ..|> AbstractProductB class ConcreteProductB1 { <<具体产品B1>> } class ConcreteProductB2 { <<具体产品B2>> } ConcreteProductA2 ..|> AbstractProductA ConcreteProductB2 ..|> AbstractProductB ConcreteFactoryA ..< ConcreteProductA1 ConcreteFactoryA ..< ConcreteProductB1 ConcreteFactoryB ..< ConcreteProductA2 ConcreteFactoryB ..< ConcreteProductB2

举例说明

我们以生产电子产品为例,因为电子产品很多,这里我们就拿电脑和手机为例,一个工厂生产一种电脑和手机,苹果工厂生产mac和iphone,华为工厂生产华为电脑和华为手机。

  1. 创建抽象产品Phone,以及具体的手机产品:iPhoneHuaweiPhone;创建抽象产品Computer,以及具体的手机产品:MacHuaweiComputer
swift 复制代码
class Computer {
    func getName() -> String {
        return ""
    }
}

class Mac: Computer {
    override func getName() -> String {
        return "Mac"
    }
}

class HuaweiComputer: Computer {
    override func getName() -> String {
        return "Huawei computer"
    }
}

class Phone {
    func getName() -> String {
        return ""
    }
}

class iPhone: Phone {
    override func getName() -> String {
        return "iPhone"
    }
}

class HuaweiPhone: Phone {
    override func getName() -> String {
        return "Huawei Phone"
    }
}
  1. 创建抽象工厂:ElectronicsAbstractFactory,生产手机和电脑
swift 复制代码
protocol ElectronicsAbstractFactory {
    func createPhone() -> Phone
    func createComputer() -> Computer
}
  1. 定义具体工厂类AppleElectronicsFactoryHuaweiElectronicsFactory
swift 复制代码
class AppleElectronicsFactory: ElectronicsAbstractFactory {
    func createPhone() -> Phone {
        return iPhone();
    }

    func createComputer() -> Computer {
        return Mac()
    }
}

class HuaweiElectronicsFactory: ElectronicsAbstractFactory {
    func createPhone() -> Phone {
        return HuaweiPhone();
    }

    func createComputer() -> Computer {
        return HuaweiComputer()
    }
}
  1. 客户端调用
swift 复制代码
func testClient() {
    let appleFactory = AppleElectronicsFactory()
    let iphone = appleFactory.createPhone()
    let mac = appleFactory.createComputer()
    print("phone: \(iphone.getName()), computer: \(mac.getName())")

    let huaweiFactory = HuaweiElectronicsFactory()
    let huaweiPhone = huaweiFactory.createPhone()
    let huaweiComputer = huaweiFactory.createComputer()
    print("phone: \(huaweiPhone.getName()), computer: \(huaweiComputer.getName())")
}

总结

优点

  1. 易于交换产品系列,由于具体的工厂类,例如let appleFactory = AppleElectronicsFactory(),在一个应用中只需要在初始化的时候出现一次,故想要改变一个具体的工厂就很容易了。
  2. 让具体的创建实例的过程与客户端分离,客户端是通过抽象接口操纵实例的,产品的具体类也被具体工厂的实现分离,因此具体的产品不会出现在客户端,减少了代码的耦合。

缺点

当需要添加一个新的产品时,比如Watch,至少需要增加三个类:Watch抽象类、iWatchHuaweiWatch,同时还需要修改ElectronicsAbstractFactoryAppleElectronicsFactoryHuaweiElectronicsFactory,违背了开闭原则。

相关推荐
Michael_lcf30 分钟前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质
丰锋ff1 小时前
设计模式学习笔记
笔记·学习·设计模式
米啦啦.2 小时前
设计模式/
观察者模式·单例模式·设计模式·工厂模式
QuZhengRong4 小时前
【AI】Agent 全栈进阶|Agent 设计模式
人工智能·学习·设计模式·llm·agent
码匠许师傅5 小时前
【设计模式精讲】2. 设计原则基石:SOLID 与几条关键原则
java·设计模式·log4j
AI人工智能+电脑小能手6 小时前
大白话说Java设计模式-41-备忘录模式(源码剖析篇)
java·设计模式·备忘录模式·源码分析·serializable·undo log·spring statemachine
yinchnag7 小时前
CRTP:奇异递归模板模式在 Go 模块系统中的实现
设计模式·go
AI人工智能+电脑小能手8 小时前
大白话说Java设计模式-40-备忘录模式(业务实战篇)
java·设计模式·事务回滚·备忘录模式·状态保存·spring transactional·购物车快照
bryant_meng1 天前
【Codex】Part 19 — Codex Prompt Design Patterns
设计模式·prompt·playbook·结果优先·用证据定义完成
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历