Prototype Pattern C# with Example
Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. In this example demonstrates the Prototype pattern in which new Color objects are created by copying pre-existing, user-defined Colors of the same type. using System; using System.Collections.Generic; namespace GangOfFour.Prototype { /// /// MainApp startup class for Real-World /// Prototype Design Pattern. /// class MainApp { /// /// Entry point into console application. /// static void Main() { ColorManager colormanager = new ColorManager(); // Initialize with standard colors colormanager["red"] = new Color(255, 0, 0); colormanager["green"] = new Color(0, 255, 0); colormanager["blue"] = new Color(0, 0, 255); // User adds personalized colors colormanager["angry"] = new Color(255, 54, 0); colormanager["peace"] = new Color(128, 211, 128); colormanager["flame"] = new Color(211, 34, 20); // User clones selected colors Color color1 = colormanager["red"].Clone() as Color; Color color2 = colormanager["peace"].Clone() as Color; Color color3 = colormanager["flame"].Clone() as Color; // Wait for user Console.ReadKey(); } } /// /// The 'Prototype' abstract class /// abstract class ColorPrototype { public abstract ColorPrototype Clone(); } /// /// The 'ConcretePrototype' class /// class Color : ColorPrototype { private int _red; private int _green; private int _blue; // Constructor public Color(int red, int green, int blue) { this._red = red; this._green = green; this._blue = blue; } // Create a shallow copy public override ColorPrototype Clone() { Console.WriteLine( "Cloning color RGB: {0,3},{1,3},{2,3}", _red, _green, _blue); return this.MemberwiseClone() as ColorPrototype; } } /// /// Prototype manager /// class ColorManager { private Dictionary _colors = new Dictionary(); // Indexer public ColorPrototype this[string key] { get { return _colors[key]; } set { _colors.Add(key, value); } } } } Output: Cloning color RGB: 255, 0, 0 Cloning color RGB: 128,211,128 Cloning color RGB: 211, 34, 20 Design Pattern