بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Prototype

الگوی Prototype اشاره به ایجاد نسخه ی تکراری از شیء داره در حالی که عملکرد را در ذهن نگه میداره. این نوع از الگوی طراحی از آن جایی که یکی از بهترین راه های ایجاد اشیاء را ارائه میده، زیرگروه الگوی تکوینی (Creational) محسوب میشه.

این الگو شامل پیاده سازیِ یک رابطِ prototype است که یک کپی از شیء جاری را ایجاد می کنه. این الگو زمانی که ایجاد مستقیم شیِ هزینه بر باشه، به کار میره. مثلاً، شیء بعد از عملیات پرهزینه ی پایگاه داده ایجاد بشه. زمانی که می خوایم تعداد دفعات فراخوانیِ پایگاه داده را کاهش بدیم، شیء را در حافظه ی نهان ذخیره می کنیم، کپیِ آن را در درخواست بعدی برمی گردانیم و پایگاه داده را به روز رسانی می کنیم.

پیاده سازی

در این بخش یک کلاس انتزاعی (abstract) به نام Shape ایجاد می کنیم، کلاس های concreteای که کلاس Shape را توسعه میدن را نیز ایجاد می کنیم. کلاس ShapeCache که در مرحله ی بعدی تعریف میشه، شی ء های shape را یک جدول هَش (Hashtable) دخیره می کنه و زمانی که درخواستی انجام بشه، یک کپی از آن ها را برمی گردانه.

PrototypPatternDemo، در نسخه ی آزمایشیِ کلاس، از کلاس ShapeCache برای گرفتن شیءِ Shape استفاده خواهیم کرد.

prototype pattern uml diagram

مرحله ی 1

ایجاد یک کلاس انتزاعی (abstract) که رابطِ Clonable را پیاده سازی می کنه.

Shape.java

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      
      try {
         clone = super.clone();
         
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      
      return clone;
   }
}

مرحله ی 2

ایجاد کلاس های concrete که کلاس بالا را گسترش میدن.

Rectangle.java

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle extends Shape {

   public Circle(){
     type = "Circle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

مرحله ی 3

ایجاد کلاسی برای گرفتن کلاس های concrete از پایگاه داده و ذخیره ی آن ها در یک جدول هَش (Hashtable).

ShapeCache.java

import java.util.Hashtable;

public class ShapeCache {
	
   private static Hashtable<String, Shape> shapeMap  = new Hashtable<String, Shape>();

   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }

   // for each shape run database query and create shape
   // shapeMap.put(shapeKey, shape);
   // for example, we are adding three shapes
   
   public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);

      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);

      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(), rectangle);
   }
}

مرحله ی 4

PrototypPatternDemo از کلاس ShapeCache برای گرفتن کپی هایی از Shapeهای ذخیره شده در جدول هَش (Hashtable) استفاده می کنه.

PrototypPatternDemo.java

public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();

      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());		

      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());		

      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());		
   }
}

مرحله ی 5

بررسی خروجی

Shape : Circle
Shape : Square
Shape : Rectangle
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد