Problem :

Online sipariş aldığımız bir uygulamamız olduğunu düşünelim. Bu uygulamada kullanıcılar geçmişte verdiği siparişlerinden tekrar oluşturmak istiyor. Yani siparişlerim sayfasından geçmiş siparişlerimi listeledim, tek bir buton ile geçmiş siparişimden bir tane daha oluşturmak istiyorum.

public Order Repeat()
{
 var dbOrder = GetOrder();
 Order newOrder = new Order
{
  Address = dbOrder.Address,
  Contact = dbOrder.Contact,
  Id = Guid.NewGuid(),
  TotalPrice = dbOrder.TotalPrice
};
return newOrder;
}

Bunu yapmak için veri tabanından geçmiş siparişi çektim. Yeni bir sipariş nesnesi oluşturdum ve tüm değerleri yeni oluşturduğum sipariş sınıfına set ettim. Sipariş nesnesine yeni bir özellik eklendiğine ya da çıkartıldığında takip etmek zorunda kalıyorum.

Çözüm :

Aslında veri tabanından alınan siparişin değişen tek değeri “Id” değeri olmasına rağmen tüm değerleri set etmek zorunda kalıyoruz.

Nesnesinin bir kolonunu alıp sadece id değerini değiştireceğimiz bir method yapabiliriz. Burada prototype pattern ile çözüm bulacağız.


Oluşturduğumuz sipariş sınıfını “ICloneable” interface implemente edeceğiz. Böylece “Clone()” methodunu oluşturmak zorunda kalacak. Clone methodu içerisinde .net system sınıfından gelen “MemberwiseClone()” methodunu kullanarak shallow kopyasını oluşturacağız.

Siparişin tekil olmasını sağlayan değer “Id” değeridir. Bizde DB’den aldığımız “Id” değerini değiştirerek kullanıcıya bağlı yeni bir sipariş oluşturabiliyoruz. Clone() methodunu kullanarak sadece “Id” değerini değiştirdiğimiz “Repeat()” methodunu oluşturdum.

Contact, Address, TotalPrice değerlerini tekrardan set etmeme gerek kalmadan bir önceki siparişin bir kopyasını elde ediyorum. Burada Guid.NewId() ile yeni bir değer atıyorum.

Sipariş sınıfına yeni eklenecek ya da çıkartılacak yeni bir değer beni artık etkilemiyor.

Repo Url :

https://github.com/gsmtcnr/DesignPattern.Creational.PrototypePattern

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir