From d253b8fa1949a0799f65201317559c5e72e3f7b6 Mon Sep 17 00:00:00 2001 From: Omar Bitar Date: Mon, 9 Dec 2024 11:55:03 +0300 Subject: [PATCH] Refactored Prototype Pattern examples for improved clarity and compatibility Enhanced code readability and structure across all Prototype Pattern example scripts. Ensured consistent use of abstract classes and interfaces for better adherence to the Prototype design pattern. Refactored cloning logic for improved clarity and robustness. Fixed issues with typecasting and exception handling in cloning implementations. Improved logging for better traceability of operations during runtime. --- .../Example1/PrototypePatternExample1.cs | 62 ++++++++----------- .../Example2/PrototypePatternExample2.cs | 21 +++---- .../Structure/PrototypeStructure.cs | 41 +++++------- 3 files changed, 47 insertions(+), 77 deletions(-) diff --git a/Assets/Creational Patterns/Prototype Pattern/Example1/PrototypePatternExample1.cs b/Assets/Creational Patterns/Prototype Pattern/Example1/PrototypePatternExample1.cs index 2cda3ed..047a3e0 100644 --- a/Assets/Creational Patterns/Prototype Pattern/Example1/PrototypePatternExample1.cs +++ b/Assets/Creational Patterns/Prototype Pattern/Example1/PrototypePatternExample1.cs @@ -15,72 +15,62 @@ public class PrototypePatternExample1 : MonoBehaviour { void Start() { - ColorManager colormanager = new ColorManager(); + var 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); + // Initialize standard colors + colorManager.SetColor("red", new Color(255, 0, 0)); + colorManager.SetColor("green", new Color(0, 255, 0)); + colorManager.SetColor("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; + // User-defined colors + colorManager.SetColor("angry", new Color(255, 54, 0)); + colorManager.SetColor("peace", new Color(128, 211, 128)); + colorManager.SetColor("flame", new Color(211, 34, 20)); + // Clone colors + var color1 = (Color)colorManager.GetColor("red").Clone(); + var color2 = (Color)colorManager.GetColor("peace").Clone(); + var color3 = (Color)colorManager.GetColor("flame").Clone(); } } - /// - /// 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; + _red = red; + _green = green; + _blue = blue; } - // Create a shallow copy public override ColorPrototype Clone() { - Debug.Log("Cloning color RGB: (" + _red + " ," + _green + "," + _blue + ")"); - - return this.MemberwiseClone() as ColorPrototype; + Debug.Log("Cloning color RGB: (" + _red + ", " + _green + ", " + _blue + ")"); + return (ColorPrototype)MemberwiseClone(); } } - /// - /// Prototype manager - /// class ColorManager { private Dictionary _colors = new Dictionary(); - // Indexer - public ColorPrototype this[string key] + public void SetColor(string key, ColorPrototype color) + { + _colors[key] = color; + } + + public ColorPrototype GetColor(string key) { - get { return _colors[key]; } - set { _colors.Add(key, value); } + return _colors[key]; } } -} +} \ No newline at end of file diff --git a/Assets/Creational Patterns/Prototype Pattern/Example2/PrototypePatternExample2.cs b/Assets/Creational Patterns/Prototype Pattern/Example2/PrototypePatternExample2.cs index 50a41b7..538f6d8 100644 --- a/Assets/Creational Patterns/Prototype Pattern/Example2/PrototypePatternExample2.cs +++ b/Assets/Creational Patterns/Prototype Pattern/Example2/PrototypePatternExample2.cs @@ -12,17 +12,15 @@ public class PrototypePatternExample2 : MonoBehaviour { void Start() { - CloneFactory factory = new CloneFactory(); - - Sheep sally = new Sheep(); + var factory = new CloneFactory(); + var sally = new Sheep(); - Sheep clonedSheep = (Sheep)factory.GetClone(sally); + var clonedSheep = (Sheep)factory.GetClone(sally); Debug.Log("Sally: " + sally.ToStringEX()); Debug.Log("Clone of Sally: " + clonedSheep.ToStringEX()); Debug.Log("Sally Hash: " + sally.GetHashCode() + " - Cloned Sheep Hash: " + clonedSheep.GetHashCode()); } - } public class CloneFactory @@ -47,25 +45,20 @@ public Sheep() public object Clone() { - Sheep sheep = null; - try { - sheep = (Sheep)base.MemberwiseClone(); + return MemberwiseClone(); } catch (Exception e) { - Debug.LogError("Error cloning Sheep"); + Debug.LogError("Error cloning Sheep: " + e.Message); + return null; } - - return sheep; } public string ToStringEX() { - return "Hello I'm a Sheep"; + return "Hello, I'm a Sheep"; } } - } - diff --git a/Assets/Creational Patterns/Prototype Pattern/Structure/PrototypeStructure.cs b/Assets/Creational Patterns/Prototype Pattern/Structure/PrototypeStructure.cs index 0ce3bf2..d758607 100644 --- a/Assets/Creational Patterns/Prototype Pattern/Structure/PrototypeStructure.cs +++ b/Assets/Creational Patterns/Prototype Pattern/Structure/PrototypeStructure.cs @@ -7,19 +7,16 @@ public class PrototypeStructure : MonoBehaviour { - - void Start( ) + void Start() { // Create two instances and clone each - ConcretePrototype1 p1 = new ConcretePrototype1("I"); ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); - Debug.Log("Cloned: "+c1.Id); + Debug.Log("Cloned: " + c1.GetId()); ConcretePrototype2 p2 = new ConcretePrototype2("II"); ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone(); - Debug.Log("Cloned: "+c2.Id); - + Debug.Log("Cloned: " + c2.GetId()); } } @@ -31,52 +28,42 @@ abstract class Prototype private string _id; // Constructor - public Prototype(string id) + protected Prototype(string id) { - this._id = id; + _id = id; } // Gets id - public string Id + public string GetId() { - get { return _id; } + return _id; } public abstract Prototype Clone(); } /// -/// A 'ConcretePrototype' class +/// A 'ConcretePrototype' class /// class ConcretePrototype1 : Prototype { - // Constructor - public ConcretePrototype1(string id) - : base(id) - { - } + public ConcretePrototype1(string id) : base(id) { } - // Returns a shallow copy public override Prototype Clone() { - return (Prototype)this.MemberwiseClone(); + return (Prototype)MemberwiseClone(); } } /// -/// A 'ConcretePrototype' class +/// A 'ConcretePrototype' class /// class ConcretePrototype2 : Prototype { - // Constructor - public ConcretePrototype2(string id) - : base(id) - { - } + public ConcretePrototype2(string id) : base(id) { } - // Returns a shallow copy public override Prototype Clone() { - return (Prototype)this.MemberwiseClone(); + return (Prototype)MemberwiseClone(); } -} +} \ No newline at end of file