es6 语法学习 - 工厂模式
一、基本概念
工厂设计模式(Factory Pattern)是一种常见的创建型设计模式,它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。
二、 优点
- 封装对象的创建过程:工厂模式将对象的创建逻辑封装在工厂类中,客户端只需要通过工厂类获取对象,而无需关心对象的创建细节。
- 降低耦合度:工厂模式通过抽象工厂和具体工厂的隔离,降低了客户端与具体产品类之间的耦合度,使得客户端程序更容易扩展和维护。
- 提高程序的可扩展性:工厂模式在新增产品时,只需要添加相应的具体产品类和工厂类,无需修改原有代码,符合开闭原则(对扩展开放,对修改关闭),提高了代码的可扩展性。
- 易于维护和升级:由于创建对象的逻辑集中在工厂类中,如果需要修改创建对象的方法,只需要修改工厂类即可,对客户端无影响。
- 代码复用:工厂模式通过抽象化对象的创建过程,实现了代码的复用,增加了代码的灵活性和可重用性。
三、缺点
- 增加系统复杂性:虽然工厂模式可以简化客户端代码,但会增加系统的整体复杂性,因为需要引入额外的工厂类和接口。
- 不利于调试:由于对象的创建过程被封装在工厂类中,当出现问题时,可能需要追踪到工厂类的实现,增加了调试的难度。
四、使用场景
- 当对象的创建过程涉及复杂的逻辑或需要特定的初始化步骤时,可以使用工厂模式来封装这些逻辑。
- 当系统中存在多种类型的对象,且这些对象的创建过程相似或存在共同点时,可以使用工厂模式来统一创建这些对象。
- 当系统需要频繁添加新产品时,使用工厂模式可以简化代码的修改和扩展过程。
五、示例代码
在这个例子中,我们将创建一个简单的工厂函数来生成不同类型的“形状”对象,如圆形(Circle)和正方形(Square)。
首先,我们定义两个类来表示圆形和正方形,每个类都有一个方法来计算其面积。
// 定义圆形类
class Circle {
constructor(radius) {
this.radius = radius;
}
getArea() {
return Math.PI * this.radius * 2;
}
}
// 定义正方形类
class Square {
constructor(side) {
this.side = side;
}
getArea() {
return this.side * 4;
}
}
接下来,我们创建一个工厂函数createShape
,它根据传入的形状类型和参数来返回相应的形状对象。
// 工厂函数
function createShape(type, ...args) {
switch (type) {
case 'circle':
return new Circle(...args);
case 'square':
return new Square(...args);
default:
throw new Error('Unknown shape type');
}
}
现在,我们可以使用createShape
函数来创建圆形和正方形对象,并调用它们的getArea
方法来计算面积。
// 创建一个圆形对象
const circle = createShape('circle', 5);
console.log('Circle Area:', circle.getArea());
// 创建一个正方形对象
const square = createShape('square', 4);
console.log('Square Area:', square.getArea());
在这个例子中,createShape
函数就是一个工厂函数,它根据传入的形状类型来创建并返回相应的形状对象。这种方式使得代码更加灵活和可扩展,因为你可以很容易地添加新的形状类型而不需要修改现有的客户端代码。只需在工厂函数中添加一个新的case
语句,并定义一个新的形状类即可。