
الگوی طراحـــــــــی Prototype
الگوی طراحی Prototype یکی از الگوهای ایجادی (Creational Patterns) است که برای ایجاد شیءها با استفاده از اصل کپیبرداری (cloning) مورد استفاده قرار میگیرد. این الگو اجازه میدهد که یک شیء اولیه (پروتوتایپ) تعریف کنیم و سپس از آن برای ایجاد شیءهای جدیدی با ویژگیهای مشابه استفاده کنیم. این کپیبرداری میتواند به دو صورت عمیق (deep) یا کمی (shallow) صورت بگیرد، که به نوع دادهها و ساختارهای آن بستگی دارد.
مفهوم الگوی Prototype به این صورت است که ما یک کلاس Prototype داریم که یک متد Clone را برای ایجاد کپی از خود به ما میدهد. سپس از این کلاس برای ایجاد کپیها به جای ایجاد شیء جدید استفاده میشود.
حالا با یک مثال واقعی و بسیار کاربردی از الگوی Prototype در زبان سی شارپ آشنا میشویم:
فرض کنید ما یک برنامه برای طراحی و سفارش پیتزا داریم. هر پیتزا ممکن است دارای تعداد مختلفی تاپینگها و تزئینات باشد. با استفاده از الگوی Prototype، میتوانیم یک پیتزا اولیه را تعریف کنیم و سپس از آن برای ایجاد پیتزاهای جدید با تنظیمات مختلف استفاده کنیم.
1. Prototype (پیتزا):
1public abstract class PizzaPrototype
2{
3 public string Name { get; set; }
4 public List<string> Toppings { get; set; }
5
6 public PizzaPrototype(string name)
7 {
8 Name = name;
9 Toppings = new List<string>();
10 }
11
12 // متد Clone برای ایجاد کپی از خود
13 public abstract PizzaPrototype Clone();
14
15 public void AddTopping(string topping)
16 {
17 Toppings.Add(topping);
18 }
19
20 public void Display()
21 {
22 Console.WriteLine($"Pizza: {Name}");
23 Console.WriteLine("Toppings: " + string.Join(", ", Toppings));
24 }
25}
26
27public class MargheritaPizza : PizzaPrototype
28{
29 public MargheritaPizza() : base("Margherita")
30 {
31 // اضافه کردن تاپینگهای پیتزا مارگاریتا به صورت پیشفرض
32 AddTopping("Tomato Sauce");
33 AddTopping("Mozzarella Cheese");
34 AddTopping("Basil Leaves");
35 }
36
37 public override PizzaPrototype Clone()
38 {
39 return (PizzaPrototype)MemberwiseClone(); // کپیبرداری کمی
40 }
41}
2. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 // ایجاد یک پیتزا مارگاریتا به عنوان پیتزای اولیه
6 MargheritaPizza originalPizza = new MargheritaPizza();
7 originalPizza.Display();
8
9 // کپی کردن پیتزای اولیه برای ساخت پیتزاهای جدید
10 MargheritaPizza clonedPizza1 = (MargheritaPizza)originalPizza.Clone();
11 clonedPizza1.AddTopping("Olives");
12 clonedPizza1.Display();
13
14 MargheritaPizza clonedPizza2 = (MargheritaPizza)originalPizza.Clone();
15 clonedPizza2.AddTopping("Mushrooms");
16 clonedPizza2.Display();
17 }
18}
خروجی برنامه به صورت زیر خواهد بود:
Pizza: Margherita
Toppings: Tomato Sauce, Mozzarella Cheese, Basil Leaves
Pizza: Margherita
Toppings: Tomato Sauce, Mozzarella Cheese, Basil Leaves, Olives
Pizza: Margherita
Toppings: Tomato Sauce, Mozzarella Cheese, Basil Leaves, Mushrooms
در این مثال، با استفاده از الگوی Prototype، ما یک برنامه برای طراحی و سفارش پیتزا ایجاد کردیم. کلاسهای `PizzaPrototype` و `MargheritaPizza` هرکدام از کلاسهای Prototype و زیرکلاس آن است. همچنین با استفاده از کلاس Client، ما یک پیتزای اولیه را تعریف کردیم و سپس از آن برای ایجاد پیتزاهای جدید با تنظیمات مختلف استفاده کردیم.
با استفاده از این الگو، ما میتوانیم به راحتی از یک شیء اولیه (پروتوتایپ) استفاده کنیم و از آن کپیهایی با ویژگیهای مختلف ایجاد کنیم بدون اینکه نیاز به ایجاد شیء جدید داشته باشیم. این الگو به ما کمک میکند تا به انعطافپذیری و به اشتراکگذاری منابع بین شیءها دست یابیم.