LoginSignup
3
3

More than 5 years have passed since last update.

TypeScriptにおける Builder pattern

Last updated at Posted at 2013-05-27

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();

結果

スクリーンショット 2013-05-28 3.54.30.png

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3