「JAVA言語で学ぶデザインパターン入門」をC#で書いてみた【Builderパターン】

「増補改訂版Java言語で学ぶデザインパターン入門」の「Builderパターン」をC#で書いてみました。

GitHubにもコードを置いています。

参考 DesignPattern【Builder】GitHub

コード

※ 一部のソースコードを表示上の理由で修正しています。正確なコードを参照したい場合、GitHubをご確認ください。


public abstract class Builder
{
    public abstract void MakeTitle(string title);
    public abstract void MakeString(string str);
    public abstract void MakeItems(IEnumerable< string> items);
    public abstract void Close();
}

public class Director
{
    private Builder builder;
    public Director(Builder builder)
    {
        this.builder = builder;
    }

    public void Construct()
    {
        builder.MakeTitle("Greeting");
        builder.MakeString("朝から昼にかけて");
        builder.MakeItems(new List< string>
        {
            "おはようございます。",
            "こんにちは。"
        });
        builder.MakeString("夜に");
        builder.MakeItems(new List< string> {
            "こんばんは。",
            "おやすみなさい。",
            "さようなら。",
        });
        builder.Close();
    }
}

public class TextBuilder : Builder
{
    private StringBuilder buffer = new StringBuilder();

    public override void Close()
    {
        buffer.Append("===================================\n");
    }

    public override void MakeItems(IEnumerable< string> items)
    {
        foreach(var item in items)
        {
            buffer.Append($" ・{item}\n");
        }
        buffer.Append("\n");
    }

    public override void MakeString(string str)
    {
        buffer.Append($"■{str}\n");
        buffer.Append("\n");
    }

    public override void MakeTitle(string title)
    {
        buffer.Append("===================================\n");
        buffer.Append($" 『{title}』 \n");
        buffer.Append("\n");
    }

    public string GetResult()
    {
        return buffer.ToString();
    }
}

public class HTMLBuilder : Builder
{
    private string filename;
    private StreamWriter writer;

    public override void Close()
    {
        using var writer = new StreamWriter(filename, true, Encoding.UTF8);
        writer.WriteLine($"< /body>< /html>");
        writer.Close();
    }

    public override void MakeItems(IEnumerable< string> items)
    {
        using var writer = new StreamWriter(filename, true, Encoding.UTF8);
        writer.WriteLine("< ul>");
        foreach (var item in items)
        {
            writer.WriteLine($"< li>{item}< /li>");
        }
        writer.WriteLine("< /ul>");
    }

    public override void MakeString(string str)
    {
        using var writer = new StreamWriter(filename, true, Encoding.UTF8);
        writer.WriteLine($"< p>{str}< /p>");
    }

    public override void MakeTitle(string title)
    {
        filename = $"{title}.html";
        using var writer = File.CreateText(filename);
        this.writer = writer;
        writer.WriteLine($"< html>< head>< title>{title}< /title>< /head>< body>");
        writer.WriteLine($"< h1>{title}< /h1>");
    }

    public string GetResult()
    {
        return filename;
    }
}

class Program
{
    static void Main(string[] args)
    {
        if (args.Length != 1)
        {
            Usage();
            Environment.Exit(0);
        }

        if (args[0].Equals("plain"))
        {
            TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            director.Construct();
            var result = textBuilder.GetResult();
            Console.WriteLine(result);
        }
        else if (args[0].Equals("html"))
        {
            HTMLBuilder htmlBuilder = new HTMLBuilder();
            Director director = new Director(htmlBuilder);
            director.Construct();
            var filname = htmlBuilder.GetResult();
            Console.WriteLine($"{filname}が作成されました。");
        }
        else
        {
            Usage();
            Environment.Exit(0);
        }
    }

    public static void Usage()
    {
        Console.WriteLine("Usage: dotnet plain     プレーンテキストで文書作成");
        Console.WriteLine("Usage: dotnet html     HTMLファイルで文書作成");
    }
}

実行結果は以下のようになります。

$dotnet Builder.dll plain

===================================
 『Greeting』 

■朝から昼にかけて

 ・おはようございます。
 ・こんにちは。

■夜に

 ・こんばんは。
 ・おやすみなさい。
 ・さようなら。

===================================
$dotnet Builder.dll html 

Greeting.htmlが作成されました。

その他のデザインパターンは以下の記事から確認してください。

「JAVA言語で学ぶデザインパターン入門」をC#で書いてみた【一覧】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA