「増補改訂版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が作成されました。
その他のデザインパターンは以下の記事から確認してください。