1:简单工厂模式
简单工厂模式是由一个工厂对象决定创建哪一种产品类的实例,它的本质是通过传入不同的参数实现多态。以此达到实例化不同对象的目的。
// 简单工厂函数
function createProduct(type) {
let product;
if (type === 'A') {
product = new ProductA();
} else if (type === 'B') {
product = new ProductB();
} else if (type === 'C') {
product = new ProductC();
}
return product;
}
// 产品类
class ProductA {
constructor() {
this.name = 'Product A';
}
}
class ProductB {
constructor() {
this.name = 'Product B';
}
}
class ProductC {
constructor() {
this.name = 'Product C';
}
}
// 使用简单工厂创建产品
const productA = createProduct('A');
console.log(productA.name); // 输出: Product A
const productB = createProduct('B');
console.log(productB.name); // 输出: Product B
const productC = createProduct('C');
console.log(productC.name); // 输出: Product C
我们简单工厂非常简单,就是它只会生产同一类产品,而且种类是写死的。但是会有一个问题,如果我想加一个产品D怎么办?我还要写一个D的类,然后再添加一个else-if,这样会使createProduct方法的职责过重比较麻烦。
这时候,工厂方法模式就出现了。
2:工厂方法模式
工厂方法模式是对简单工厂模式进行了一次抽象,将某一类对象具体细分给对应的工程,比方说A要在A工厂里生产,B要在B工厂里生产。专人干专事。相比于简单工厂,工厂方法将修改原来的代码转变为单纯的增加代码。
// 工厂基类
class Factory {
createProduct() {
throw new Error('This method should be overridden.');
}
}
// 具体工厂类
class ProductAFactory extends Factory {
createProduct() {
return new ProductA();
}
}
class ProductBFactory extends Factory {
createProduct() {
return new ProductB();
}
}
class ProductCFactory extends Factory {
createProduct() {
return new ProductC();
}
}
// 产品类同上
// 使用工厂方法创建产品
const productAFactory = new ProductAFactory();
const productA = productAFactory.createProduct();
console.log(productA.name); // 输出: Product A
const productBFactory = new ProductBFactory();
const productB = productBFactory.createProduct();
console.log(productB.name); // 输出: Product B
const productCFactory = new ProductCFactory();
const productC = productCFactory.createProduct();
console.log(productC.name); // 输出: Product C
但是这个时候我要新增一个D类呢?我们还是需要再写一个D工厂。
所以说,工厂方法的缺点就是类的个数容易增多,增加复杂度,而且会增加系统抽象性和理解难度。
3:简单工厂模式和工厂方法模式的对比
工厂方法模式并不是一定优于简单工厂模式,适合的才是最好的。
下面我们比较一下两种工厂模式的优缺点:
首先说一下简单工厂模式的优点:
1:代码复杂度低 2:结构复杂度低
3:编程复杂度低 4:管理复杂度低
说一下方法工厂模式的优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只需要关心产品的接口。
方法工厂模式的缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
结论:
根据设计原则:使用工厂方法模式
根据实际业务:简单工厂模式更适用