es6 语法学习 - 抽象工厂模式
一、基本概念
抽象工厂设计模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口用来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式允许客户端代码与具体类解耦,从而实现更高的灵活性和可扩展性。
二、 优点
- 解耦:客户端代码不需要了解所有的具体类,有助于实现模块化和解耦。
- 可扩展性:可以很方便地添加新的产品族,而无需对现有代码进行重大修改。
- 一致性:确保产品族中的产品彼此兼容。
三、缺点
- 增加复杂性:引入新的抽象层次,可能使代码结构变得更加复杂。
- 难以支持新产品:如果需要添加新的产品类型,可能需要修改抽象工厂的接口,导致之前的代码出现问题。
四、使用场景
- 当系统需要独立于产品的创建、组合和表示时。
- 当一个系统要由多个产品家族中的产品来组成时。
- 当需要提供一个类库,所有的产品都是通过一个统一的接口创建时。
五、示例代码
在这个例子中,我们将创建两个产品系列:Light(灯)和Button(按钮),每个系列都有两种实现:LED和Incandescent(对于灯),以及Plastic和Metal(对于按钮)。我们将使用一个抽象工厂来生成这些产品的实例。
首先,我们定义产品的接口(通过抽象类来模拟):
// 抽象产品:灯
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是一个抽象工厂接口,它定义了创建Light和Button产品的方法。PlasticAndLEDFactory和MetalAndIncandescentFactory是具体工厂,它们实现了抽象工厂接口,并提供了创建具体产品的方法。客户端代码使用具体工厂来创建产品对象,而不需要知道这些对象的具体实现。
49

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



