TypeScriptにおける Builder pattern
進撃の巨人OP中毒になる動画を見てたら書きたくなったので。
class Slime {
private colorName: string;
private dockable: bool = false;
public color(colorName: string): void {
this.colorName = colorName;
}
public isDockable(): void {
this.dockable = true;
}
public isNotDockable(): void {
this.dockable = false;
}
}
class SlimeBuilder {
public slime: Slime;
public buildColor(): void { };
public buildDockable(): void { };
public createNewSlime() {
this.slime = new Slime();
}
public getSlime(): Slime {
return this.slime;
}
}
class NormalSlimeBuilder extends SlimeBuilder {
public buildColor(): void {
this.slime.color('Blue');
}
public buildDockable(): void {
this.slime.isDockable();
}
}
class SheSlimeBuilder extends SlimeBuilder {
public buildColor(): void {
this.slime.color('Red');
}
public buildDockable(): void {
this.slime.isNotDockable();
}
}
class LiquidMetalSlimeBuilder extends SlimeBuilder {
public buildColor(): void {
this.slime.color('Metal');
}
public buildDockable(): void {
this.slime.isNotDockable();
}
}
class Field {
private slimeBuilder: SlimeBuilder;
public setSlimeBuilder(slimeBuilder: SlimeBuilder) {
this.slimeBuilder = slimeBuilder;
}
public getSlime(): Slime {
return this.slimeBuilder.getSlime();
}
public respawnSlime(): void {
this.slimeBuilder.createNewSlime();
this.slimeBuilder.buildColor();
this.slimeBuilder.buildDockable();
}
}
module BuilderRunner {
export function execute() {
var field: Field = new Field();
var normalSlime: NormalSlimeBuilder = new NormalSlimeBuilder();
field.setSlimeBuilder(normalSlime);
field.respawnSlime();
console.dir(field.getSlime());
var sheSlime: SheSlimeBuilder = new SheSlimeBuilder();
field.setSlimeBuilder(sheSlime);
field.respawnSlime();
console.dir(field.getSlime());
var liquidMetalSlime: LiquidMetalSlimeBuilder = new LiquidMetalSlimeBuilder();
field.setSlimeBuilder(liquidMetalSlime);
field.respawnSlime();
console.dir(field.getSlime());
}
}
BuilderRunner.execute();