Prototype Design Pattern (Prototip Tasarım Deseni), nesne oluşturma işlemi maliyetli ve çok fazla zaman/kaynak gerektiren bir iş olduğundan dolayı yeni bir nesne oluşturmak yerine halihazırda benzer bir nesneyi kullanmak istediğimiz zamanda kullanılır.
Prototip deseni, orijinal nesneyi yeni bir nesneye kopyalamak ve ardından ihtiyaçlarımıza göre değiştirmek için bir mekanizma sağlar. Diğer bir deyişle sıfırdan yaratılması maliyetli olan nesneleri klonlama yoluyla oluşturmayı sağlar.
Bir örnekle prototip tasarım desenini anlamak kolay olacaktır. Veri tabanından veri yükleyen bir Nesnemiz olduğunu varsayalım. Şimdi programımızda bu verileri birden çok kez değiştirmemiz gerekiyor, bu nedenle new anahtar sözcüğünü kullanarak Object oluşturmak ve tüm verileri veri tabanından yeniden yüklemek ilk aklımıza gelen fikir olacaktır ama bu iyi bir fikir değil. Daha iyi yaklaşım, mevcut nesneyi yeni bir nesneye klonlamak ve ardından veri işlemeyi yapmak olacaktır.
UML Class Diyagramı
Kullanım sıklığı: orta
Prototype Presinpleri
Client, nesneyi kullanmak isteyen sınıftır. Prototype bir abstract (soyut) sınıf yada interface olabilir. Kendini klonlayan sınıflara taban oluşturur. ConcreatePrototype, kendini klonlayabilen nesnelerin sınıflarıdır.
Prototype patern’i uygulayabilmek için C#’da ICloneable adlı bir interface’den faydalanırız. Bu interface implemen ettiğimiz’de sınıfı uygulanan Clone() isimli metot bize bu alt yapıyı sağlar.
C# Prototype Design Pattern Uygulama
Bu senaryomuzda bir çalışan sınıfı tanımlayıp Prototype Design Pattern uygulayarak nesnemiz klonlayacağız.
Prototype Design Pattern’nı kullanmak için .NET’de bulunan System ICloneable interface’ini kullanıyoruz.
public class Employees : ICloneable
{
private List<string> empList;
public Employees()
{
empList = new List<string>();
}
public Employees(List<string> empList)
{
this.empList = empList;
}
public void loadData()
{
empList.Add("Fatih");
empList.Add("Beyazıt");
empList.Add("Yavuz");
empList.Add("Zeynep");
empList.Add("Ayse");
}
public List<string> getEmpList()
{
return empList;
}
//Klonlama işlemini Icloneable interface üzerinden implement ettiğimiz clone metotu üzerinde gerçekleştiriyoruz.
public object Clone()
{
List<string> temp = new List<string>();
foreach (string item in getEmpList())
{
temp.Add(item);
}
return new Employees(temp);
}
}
Employees listesinin kapsamlı bir kopyasını sağlamak için Clone metodunu ezdiğimize dikkat edin.
Program.cs – Main Method
Employees employees = new Employees();
employees.loadData();
//Çalışan nesnesini almak için clone metodunu kullanın
Employees employeesClone1 = (Employees)employees.Clone();
Employees employeesClone2 = (Employees)employees.Clone();
List<String> list2 = employeesClone2.getEmpList();
list2.Add("Betül");
Console.WriteLine("Employees: " + employees.getEmpList());
foreach (string item in employees.getEmpList())
{
Console.WriteLine(item);
}
Console.WriteLine("\nEmployees Clone 1: " + employeesClone1.getEmpList());
foreach (string item in employeesClone1.getEmpList())
{
Console.WriteLine(item);
}
Console.WriteLine("\nEmployees Clone 2: " + employeesClone2.getEmpList());
foreach (string item in list2)
{
Console.WriteLine(item);
}
Sonuç
Employees: System.Collections.Generic.List`1[System.String]
Fatih
Beyazıt
Yavuz
Zeynep
Ayse
Employees Clone 1: System.Collections.Generic.List`1[System.String]
Fatih
Beyazıt
Yavuz
Zeynep
Ayse
Employees Clone 2: System.Collections.Generic.List`1[System.String]
Fatih
Beyazıt
Yavuz
Zeynep
Ayse
Betül