设计模式-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,违背了开闭原则。

相关推荐
将编程培养成爱好2 分钟前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式
猿太极3 分钟前
设计模式学习(3)-行为型模式
c++·设计模式
快乐非自愿2 小时前
常用设计模式:工厂方法模式
javascript·设计模式·工厂方法模式
guangzan8 小时前
常用设计模式:模板方法模式
设计模式
Lei_33596711 小时前
[設計模式]二十三種設計模式
设计模式
吃饺子不吃馅13 小时前
面试官:JWT、Cookie、Session、Token有什么区别?
前端·设计模式·面试
leafff12314 小时前
一文读懂:如何选择适合的RAG系统架构设计模式?
设计模式·自然语言处理·系统架构
ZHE|张恒16 小时前
设计模式实战篇(一):彻底搞懂 Singleton 单例模式
单例模式·设计模式
喝拿铁写前端1 天前
从面条代码到抽象能力:一个小表单场景里的前端成长四阶段
前端·设计模式·架构
依米_1 天前
一文带你剖析 Promise.then all 实现原理,状态机、发布订阅模式完美实现异步编程
javascript·设计模式