「増補改訂版Java言語で学ぶデザインパターン入門」の「Prototypeパターン」をC#で書いてみました。
GitHubにもコードを置いています。
参考
DesignPattern【Prototype】GitHub
コード
public interface IProduct : ICloneable
{
void Use(string s);
IProduct CreateClone();
}
public class Manager
{
private IDictionary string, IProduct> showcase = new Dictionary string, IProduct>();
public void Register(string name, IProduct proto)
{
showcase.Add(name, proto);
}
public IProduct Create(string protoname)
{
IProduct p = showcase[protoname];
return p.CreateClone();
}
}
public class UnderlinePen:IProduct
{
private char ulchar;
public UnderlinePen(char ulchar)
{
this.ulchar = ulchar;
}
public void Use(string s)
{
int length = Encoding.GetEncoding("Shift_JIS").GetByteCount(s);
Console.WriteLine($"\"{s}\"");
Console.Write(" ");
for(int i = 0; i length; i++)
{
Console.Write(ulchar);
}
Console.WriteLine(" ");
}
public IProduct CreateClone()
{
return (IProduct)Clone();
}
public object Clone()
{
return this.MemberwiseClone();
}
}
public class MessageBox : IProduct
{
private char decochar;
public MessageBox(char decochar)
{
this.decochar = decochar;
}
public object Clone()
{
return this.MemberwiseClone();
}
public IProduct CreateClone()
{
return (IProduct)Clone();
}
public void Use(string s)
{
int length = Encoding.GetEncoding("Shift_JIS").GetByteCount(s);
for (int i = 0; i length + 4; i++)
{
Console.Write(decochar);
}
Console.WriteLine("");
Console.WriteLine($"{decochar} {s} {decochar}");
for (int i = 0; i length + 4; i++)
{
Console.Write(decochar);
}
Console.WriteLine("");
}
}
class Program
{
static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// 準備
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('-');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.Register("string message", upen);
manager.Register("warning box", mbox);
manager.Register("slash box", sbox);
// 生成
IProduct p1 = manager.Create("string message");
p1.Use("Hello, world.");
IProduct p2 = manager.Create("warning box");
p2.Use("Hello, world.");
IProduct p3 = manager.Create("slash box");
p3.Use("Hello, world.");
}
}
実行結果は以下のようになります。
"Hello, world."
-------------
*****************
* Hello, world. *
*****************
/////////////////
/ Hello, world. /
/////////////////
その他のデザインパターンは以下の記事から確認してください。