es6 语法学习 - 抽象工厂模式

部署运行你感兴趣的模型镜像

es6 语法学习 - 抽象工厂模式

一、基本概念

抽象工厂设计模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口用来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式允许客户端代码与具体类解耦,从而实现更高的灵活性和可扩展性。

二、 优点

  • 解耦:客户端代码不需要了解所有的具体类,有助于实现模块化和解耦。
  • 可扩展性:可以很方便地添加新的产品族,而无需对现有代码进行重大修改。
  • 一致性:确保产品族中的产品彼此兼容。

三、缺点

  • 增加复杂性:引入新的抽象层次,可能使代码结构变得更加复杂。
  • 难以支持新产品:如果需要添加新的产品类型,可能需要修改抽象工厂的接口,导致之前的代码出现问题。

四、使用场景

  • 当系统需要独立于产品的创建、组合和表示时。
  • 当一个系统要由多个产品家族中的产品来组成时。
  • 当需要提供一个类库,所有的产品都是通过一个统一的接口创建时。

五、示例代码

在这个例子中,我们将创建两个产品系列:Light(灯)和Button(按钮),每个系列都有两种实现:LEDIncandescent(对于灯),以及PlasticMetal(对于按钮)。我们将使用一个抽象工厂来生成这些产品的实例。

首先,我们定义产品的接口(通过抽象类来模拟):

// 抽象产品:灯
class Light {
  constructor() {
    if (new.target === Light) {
      throw new Error('Cannot instantiate abstract class!');
    }
  }

  turnOn() {
    throw new Error('Method turnOn() must be implemented.');
  }

  turnOff() {
    throw new Error('Method turnOff() must be implemented.');
  }
}

// 抽象产品:按钮
class Button {
  constructor() {
    if (new.target === Button) {
      throw new Error('Cannot instantiate abstract class!');
    }
  }

  press() {
    throw new Error('Method press() must be implemented.');
  }
}

接下来,我们为每种产品系列创建具体的实现:

// 具体产品:LED灯
class LEDLight extends Light {
  turnOn() {
    console.log('LED Light is on');
  }

  turnOff() {
    console.log('LED Light is off');
  }
}

// 具体产品:白炽灯
class IncandescentLight extends Light {
  turnOn() {
    console.log('Incandescent Light is on');
  }

  turnOff() {
    console.log('Incandescent Light is off');
  }
}

// 具体产品:塑料按钮
class PlasticButton extends Button {
  press() {
    console.log('Plastic Button is pressed');
  }
}

// 具体产品:金属按钮
class MetalButton extends Button {
  press() {
    console.log('Metal Button is pressed');
  }
}

现在,我们创建抽象工厂接口(同样通过抽象类来模拟)和具体工厂:

// 抽象工厂
class UIFactory {
  constructor() {
    if (new.target === UIFactory) {
      throw new Error('Cannot instantiate abstract class!');
    }
  }

  createLight() {
    throw new Error('Method createLight() must be implemented.');
  }

  createButton() {
    throw new Error('Method createButton() must be implemented.');
  }
}

// 具体工厂:用于创建LED灯和塑料按钮
class PlasticAndLEDFactory extends UIFactory {
  createLight() {
    return new LEDLight();
  }

  createButton() {
    return new PlasticButton();
  }
}

// 具体工厂:用于创建白炽灯和金属按钮
class MetalAndIncandescentFactory extends UIFactory {
  createLight() {
    return new IncandescentLight();
  }

  createButton() {
    return new MetalButton();
  }
}

最后,我们使用工厂来创建产品对象:

// 使用PlasticAndLEDFactory创建产品
const ledFactory = new PlasticAndLEDFactory();
const ledLight = ledFactory.createLight();
const plasticButton = ledFactory.createButton();

ledLight.turnOn(); // 输出: LED Light is on
plasticButton.press(); // 输出: Plastic Button is pressed

// 使用MetalAndIncandescentFactory创建产品
const incandescentFactory = new MetalAndIncandescentFactory();
const incandescentLight = incandescentFactory.createLight();
const metalButton = incandescentFactory.createButton();

incandescentLight.turnOn(); // 输出: Incandescent Light is on
metalButton.press(); // 输出: Metal Button is pressed

在这个例子中,UIFactory是一个抽象工厂接口,它定义了创建LightButton产品的方法。PlasticAndLEDFactoryMetalAndIncandescentFactory是具体工厂,它们实现了抽象工厂接口,并提供了创建具体产品的方法。客户端代码使用具体工厂来创建产品对象,而不需要知道这些对象的具体实现。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值