Prototype Design Pattern

GOF Intent:
Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

هنگامي که از new براي ساخت کلاس استفاده شود، يک Object کاملا از نو و مطابق مشخصات آن کلاس ساخته مي شود.

اما گاهي خوب است که بتوانيم از يک Object موجود يک کپي تهيه کنيم.

براي درک بيشتر مثال زير را در نظر بگيريد:
فرض کنيد مي خواهيم چند عدد کيک بپزيم. کيک هايي که در اساس مانند هم هستند و همگي از تخم مرغ و آرد و شير و غيره تشکيل شده اند. اما بعضي با سيب تزئين مي شوند و بعضي با آناناس و بعضي با پرتقال. در اينجا راحت تر است يک Prototype از کيک اصلي داشته باشيم و براي همه کيک ها ابتدا يک کپي از روي آن تهيه کنيم و سپس فقط آن را به دلخواه تزئين نمائيم.

استفاده از Clone:
اساس اين امکان، متد Clone است که در زبان هاي مختلف براي کپي کردن Object ها بکار مي رود. نحوه اين کار در زبان جاوا بدين شکل است:

public class CopyMe implements Cloneable{
   public Object clone() {
      try {
         return super.clone();
      } catch (CloneNotSupportedException ex) {
         return null;
      }
   }
}

حال با توجه به Clonable بودن CopyMe براي تهيه کپي از يک نمونه اين کلاس اينگونه عمل مي کنيم:

CopyMe instance1 = new CopyMe();

CopyMe instance2 = (CopyMe) instance1.clone();

دياگرام اين Pattern بدين شکل است:

Prototype Design Pattern

نمونه کد:

public abstract class Vehicle implements Cloneable{
   private String name;

   // Setter & Getter Methods
   …

   public Object clone() {
      try {
         return super.clone();
      } catch (CloneNotSupportedException ex) {
         return null;
      }
   }
}

public class Car extends Vehicle{
   private String producer;

   private String color;
   private boolean automaticGear = false;

   // Setter & Getter Methods
   …
}



public static void main(String[] args) {
   Car template_Pride = new Car();
   template_Pride.setName(“Pride”);
   template_Pride.setProducer(“Iran”);

   Car template_BMW = new Car();
   template_BMW.setName(“BMW”);
   template_BMW.setProducer(“Germany”);

   Car myCar = (Car) template_Pride.clone();
   myCar.setColor(“White”);

   Car yourCar = (Car) template_BMW.clone();
   yourCar.setColor(“Red”);
   yourCar.setAutomaticGear(true);

   Car hisCar = (Car) template_BMW.clone();
   hisCar.setColor(“Blue”);

   System.out.println(“I have a “+myCar.getColor()+” “+myCar.getName());
   System.out.println(“You have a “+yourCar.getColor()+” “+yourCar.getName());
}

فايده هاي Prototype:

  • به برنامه ساز اين امکان را مي دهد که با تعريف Prototype يک کلاس جديد قابل instant ساختن بصورت دايناميک تعريف نمايد.
  • براي پرهيز از ايجاد SubClass هاي زياد و غيرضروري مي توان از Prototype استفاده کرد.
  • مي توان Prototype را جايگزين Factory Method نمود. مي توان بطور کلي سلسله مراتب Creator ها را حذف نمود و به جاي آن Prototype مناسب را از Prototype Repository ، Clone نمود.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Prototype design Pattern in codeproject
  3. javabestpractice

با برچسب: ,
پست شده در Design Pattern

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


− سه = 1

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com