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

「増補改訂版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. /
/////////////////

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

コメントを残す

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

CAPTCHA