0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TypeScriptでデザインパターン[7.Builder]

Posted at

はじめに

Typescriptでデザインパターンをやっていくシリーズ(にする予定です)

結城 浩さんの「Java言語で学ぶデザインパターン入門」をTSに置き換えてTS力をあげていこうという趣旨です。

前回はこちら

メモ

  • for ... in は配列に使ってはいけない
    • 順序も保証されない
    • オブジェクトのキー値をループするためのもので、配列のキー以外も取れてしまうから
    • forEachを使う
    • for ... ofを使う
  • ファイル操作はfs
  • JavaはStringBuilderを使ってたけど、JSは普通にstringの足し算できるけどどういう仕組みなんだろなとちょっと気になった

Code

const fs = require("fs");

namespace Builder {
  abstract class Builder {
    abstract makeTitle(title: string): void;
    abstract makeString(str: string): void;
    abstract makeItems(items: string[]): void;
    abstract close(): void;
  }

  class Director {
    private builder: Builder;

    constructor(builder: Builder) {
      this.builder = builder;
    }

    constract(): void {
      this.builder.makeTitle("タイトル");
      this.builder.makeString("これは本文");
      this.builder.makeItems(["りんご", "ごりら", "ラッパ"]);
      this.builder.makeString("これも本文");
      this.builder.makeItems(["プロテイン", "グルタミン", "ケトジェニック"]);
      this.builder.close();
    }
  }

  class TextBuilder extends Builder {
    private buffer: string = "";

    makeTitle(title: string): void {
      this.buffer += "===============================\n";
      this.buffer += `「${title}」\n\n`;
    }
    makeString(str: string): void {
      this.buffer += `□${str}\n\n`;
    }
    makeItems(items: string[]): void {
      items.forEach((item) => {
        this.buffer += `- ${item} \n`;
      });
      this.buffer += "\n";
    }

    close(): void {
      this.buffer += "===============================\n";
    }

    getResult(): string {
      return this.buffer;
    }
  }

  class MarkDownBuilder extends Builder {
    private buffer: string = "";

    makeTitle(title: string): void {
      this.buffer += `# ${title}\n\n`;
    }
    makeString(str: string): void {
      this.buffer += `${str}\n\n`;
    }
    makeItems(items: string[]): void {
      items.forEach((item) => {
        this.buffer += `- ${item} \n`;
      });

      this.buffer += "\n";
    }

    close(): void {
      this.buffer;
      fs.writeFileSync("output.txt", this.buffer);
    }

    getResult(): string {
      return "output.txt";
    }
  }

  class Main {
    main() {
      {
        const textBuilder = new TextBuilder();
        const director = new Director(textBuilder);
        director.constract();
        const result = textBuilder.getResult();
        console.log(result);
      }

      {
        const markDownBuilder = new MarkDownBuilder();
        const director = new Director(markDownBuilder);
        director.constract();
        const result = markDownBuilder.getResult();
        console.log(result);
        fs.readFile(result, "utf-8", (_err: any, data: any) => {
          console.log(data);
        });
      }
    }
  }
  new Main().main();
}


0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?