我只是在学习设计模式,我不知道下面代码中抽象的好处是什么:我重写了代码,仍然按照我们想要的方式工作。
你可以从这里看到原始代码
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
。
所有extend
Creator
必须实现factoryMethod
方法的具体类。但是基础abstract class Creator
不需要实现它。
factoryMethod
的Creator实例是不可能的。