我的朋友她说我之前写的没有体现出工厂模式的精华
如何使用工厂方法模式在Vue,React中创建不同类型的组件 - 掘金 (juejin.cn)
所以,接前文,也就为什么会有这篇文章!
她说
于是就有了这样的一个故事!
我有一个朋友叫石头,她是个女生,她跟我说,在掘金技术论坛社区中,网友们喜欢看一些骚里骚气的技术文章,那我们就用骚气的方式来讲解一下工厂模式吧。
哇塞!JavaScript 的工厂设计模式简直就是工业界的黑科技啊!使用这种骚气的设计模式,你可以轻松地创建对象,让你的代码变得更加模块化、可扩展性更高!
工厂设计模式是一种创建型设计模式,它能够帮助我们在不暴露对象创建逻辑的情况下,创建各种类型的对象。在 JavaScript 中,我们可以使用工厂函数来实现这种设计模式。
比如说,假设我们有一个汽车工厂,我们可以使用工厂函数来创建不同类型的汽车对象,比如轿车、越野车、卡车等等。这样,我们就可以把对象创建的过程抽象出来,让代码变得更加灵活、可复用。
下面,我就来给大家展示一下如何使用工厂设计模式来创建对象:
// 创建汽车工厂函数
function CarFactory(type, color, price) {
// 根据 type 参数创建不同类型的汽车对象
switch (type) {
case 'sedan':
return new SedanCar(color, price);
case 'suv':
return new SuvCar(color, price);
case 'truck':
return new TruckCar(color, price);
default:
throw new Error('Invalid car type');
}
}
// 创建轿车对象的构造函数
function SedanCar(color, price) {
this.type = 'sedan';
this.color = color;
this.price = price;
}
// 创建越野车对象的构造函数
function SuvCar(color, price) {
this.type = 'suv';
this.color = color;
this.price = price;
}
// 创建卡车对象的构造函数
function TruckCar(color, price) {
this.type = 'truck';
this.color = color;
this.price = price;
}
// 使用汽车工厂函数创建不同类型的汽车对象
const sedan = CarFactory('sedan', 'red', 20000);
const suv = CarFactory('suv', 'blue', 30000);
const truck = CarFactory('truck', 'green', 40000);
// 输出汽车对象信息
console.log(sedan); // SedanCar { type: 'sedan', color: 'red', price: 20000 }
console.log(suv); // SuvCar { type: 'suv', color: 'blue', price: 30000 }
console.log(truck); // TruckCar { type: 'truck', color: 'green', price: 40000 }
石头说你得讲一下啊,聚合呀,
可是我不知道聚合是什么意思?
她说聚合是一种常见的编程概念,它是指将多个对象或者数据结构组合成一个更大的、更复杂的对象或者数据结构的过程。聚合可以帮助我们将多个对象或者数据结构组合起来,形成一个整体,方便我们对其进行操作和管理。
在面向对象编程中,聚合通常指的是将多个对象组合成一个更大的对象。比如说,我们可以创建一个班级对象,其中包含多个学生对象。这样,我们就可以将多个学生对象聚合成一个班级对象,方便我们对整个班级进行管理和操作。
在数据结构中,聚合通常指的是将多个数据结构组合成一个更大的数据结构。比如说,我们可以将多个数组组合成一个更大的数组,或者将多个对象合并成一个更大的对象。这样,我们就可以将多个数据结构聚合成一个更大的数据结构,方便我们进行操作和处理。
总之,聚合是一种非常常见的编程概念,它可以帮助我们将多个对象或者数据结构组合起来,形成一个整体,方便我们对其进行操作和管理。
于是我问她。那和工厂模式有什么关系?如何在工厂模式当中体现这种聚合?
她说,在工厂模式中,我们可以通过聚合来创建和管理对象。具体来说,工厂模式可以帮助我们将多个相关的对象组合成一个整体,并通过这个整体来创建和管理对象。
举个例子,假设我们正在开发一个游戏,这个游戏有多种不同的角色,比如战士、法师、刺客等等。每个角色都有自己的属性和行为,但是它们也有一些共同的特点,比如都有一个名字和一个等级。
在这种情况下,我们可以使用工厂模式来管理这些角色。具体来说,我们可以创建一个角色工厂,其中包含多个角色对象。每个角色对象都是一个独立的实例,但它们也有一些共同的属性和方法。通过角色工厂,我们可以方便地创建和管理多个角色对象,而不需要手动创建每个对象。
我的朋友石头说,可以用下面这个简单的案例来体现,展示如何在工厂模式中使用聚合来创建和管理对象:
// 定义一个角色基类
class Role {
constructor(name, level) {
this.name = name;
this.level = level;
}
}
// 定义多个角色类,继承自角色基类
class Warrior extends Role {
constructor(name, level) {
super(name, level);
this.type = 'Warrior';
}
}
class Mage extends Role {
constructor(name, level) {
super(name, level);
this.type = 'Mage';
}
}
class Assassin extends Role {
constructor(name, level) {
super(name, level);
this.type = 'Assassin';
}
}
// 定义一个角色工厂类,用于创建和管理角色对象
class RoleFactory {
constructor() {
this.roles = [];
}
// 添加角色对象到工厂中
addRole(role) {
this.roles.push(role);
}
// 根据角色类型创建角色对象
createRole(type, name, level) {
let role;
switch (type) {
case 'Warrior':
role = new Warrior(name, level);
break;
case 'Mage':
role = new Mage(name, level);
break;
case 'Assassin':
role = new Assassin(name, level);
break;
default:
throw new Error('Invalid role type.');
}
this.addRole(role);
return role;
}
}
// 创建一个角色工厂实例
const roleFactory = new RoleFactory();
// 创建多个角色对象,并添加到工厂中
const warrior1 = roleFactory.createRole('战士', '石头', 10);
const mage1 = roleFactory.createRole('法师', '大锤', 8);
const assassin1 = roleFactory.createRole('刺客', '黎哥就是我', 12);
// 输出角色工厂中所有角色对象
console.log(roleFactory.roles);
工厂模式是一种创建型设计模式,其目的是封装对象的创建过程。在使用工厂模式时,不直接使用new关键字来创建对象,而是通过一个工厂类或者函数来封装对象的创建过程,从而实现了对象的解耦和重复使用。
在工厂模式中,我们可以定义一个接口或者抽象类来表示所需要创建的对象类型,然后通过不同的工厂类或者函数来创建具体的对象。这样,当我们需要创建一个新的对象时,只需要向工厂类或者函数提供所需的参数即可,无需关心对象的具体创建过程。
工厂模式可以有效地提高代码的可维护性和扩展性,同时也可以避免在客户端代码中直接创建对象所带来的不必要的耦合。它在实际开发中的应用非常广泛,例如在React框架中,我们可以使用工厂模式来创建组件,从而实现组件的灵活配置和复用。