工厂方法设计模式



我只是在学习设计模式,我不知道下面代码中抽象的好处是什么:我重写了代码,仍然按照我们想要的方式工作。

你可以从这里看到原始代码

class Creator {
public factoryMethod() {}
public someOperation(): string {
const product = this.factoryMethod();
return `Creator: The same creator's code has just worked with ${product}`;
}
}
class ConcreteCreator1 extends Creator {
public factoryMethod(): string {
return '{Result of the ConcreteProduct1}';
}
}
class ConcreteCreator2 extends Creator {
public factoryMethod(): string {
return '{Result of the ConcreteProduct2}';
}
}
function clientCode(creator: Creator) {
console.log(
"Client: I'm not aware of the creator's class, but it still works."
);
console.log(creator.someOperation());
}
console.log('App: Launched with the ConcreteCreator1.');
clientCode(new ConcreteCreator1());
console.log('');
console.log('App: Launched with the ConcreteCreator2.');
clientCode(new ConcreteCreator2());

将您的代码与原始代码进行比较,您已经将abstract class Creator更改为具体的class Creator。这意味着你现在可以通过调用new Creator()来实例化这个类。

问题是你的基本Creator类没有真正实现factoryMethod()方法。你已经把它变成了一个具体的方法,什么都不做,并返回void。当你调用clientCode(new Creator());时,你得到的输出不是你想要的:

"Creator:同一创建者的代码刚刚使用了undefined">

为什么使用抽象类

abstract class Creator {
public abstract factoryMethod(): Product;
/* ... */

原始代码示例使用abstract class Creator来建立所有具体创建者必须履行的契约。它说:"为了成为Creator,您必须有一个返回Product">factoryMethod

所有extendCreator必须实现factoryMethod方法的具体类。但是基础abstract class Creator不需要实现它。

缺少实现不是问题,因为抽象类不能被实例化。因此,没有factoryMethod的Creator实例是不可能的。

最新更新