بخش های اصلی

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

Design Pattern - الگوی Flyweight

الگوی Flyweight در درجه ی اول برای کاهش تعداد اشیا ایجاد شده و کاهش استفاده از حافظه و افزایشِ کارایی به کار میره. از آن جایی که این الگوی طراحی روش هایی برای کاهشِ تعداد اشیاء و در نتیجه بهبود ساختارِ شیءایِ نرم افزار فراهم می کنه، زیرگروه الگوی ساختاری (structural) محسوب میشه.

الگوی Flyweight تلاش می کنه تا با ذخیره کردنِ اشیاء، از اشیاء مشابهِ موجود، استفاده ی مجدد بکنه و فقط زمانی که شیء ای مشابه با شیءِ موجود پیدا نکنه، شیءای جدید ایجاد کنه. این الگو را با کشیدن 20 دایره در مکان های متفاوت و در عین حال استفاده از فقط 5 شیء به شما نشان میدیم. فقط 5 رنگ داریم و پراپرتیِ color برای بررسیِ اشیاءِ Circleای که از قبل وجود دارن به کار میره.

پیاده سازی

در این بخش یک رابط به نام Shape و کلاسِconcreteای به نام Circle که رابطِ Shape را پیاده سازی می کنه، ایجاد می کنیم. یک کلاسِ factory به نام ShapeFactory نیز در مرحله ی بعدی تعریف می کنیم.

ShapeFactory یک HashMap از Circle داره که دارای یک کلید بعنوان رنگِ شیءِ Circle است. هروقت درخواستی برای ایجاد یک دایره به رنگی خاص برای ShapeFactory ارسال می شه، شیءِ cirlcle موجود در HashMapاَش را بررسی می کنه، اگه شیءِ Circle پیدا بشه، آن شیء را برمی گردانه، در غیر این صورت، یک شیء جدید ایجاد می کنه و آن را برای استفاده ه ای آتی برای کلاینت، در hashmap ذخیره می کنه.

FlyWeightPatternDemo، نسخه ی آموزشیِ کلاس مان، از ShapeFactory، برای گرفتنِ یک شیءِ Shape استفاده می کنه. ShapeFactory اطلاعاتِ (red (قرمز) / green (سبز) / blue (آبی) / black (مشکی) / white (سفید)) را برای گرفتن circle با رنگ دلخواهی که میخوایم، به ShapeFactory پاس میده.

flyweight pattern uml diagram

مرحله ی 1

ایجاد یک رابط.

Shape.java

public interface Shape {
   void draw();
}

مرحله ی 2

ایجاد کلاس های concreteای که رابطی یکسان را پیاده سازی می کنن.

Circle.java

public class Circle implements Shape {
   private String color;
   private int x;
   private int y;
   private int radius;

   public Circle(String color){
      this.color = color;		
   }

   public void setX(int x) {
      this.x = x;
   }

   public void setY(int y) {
      this.y = y;
   }

   public void setRadius(int radius) {
      this.radius = radius;
   }

   @Override
   public void draw() {
      System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius);
   }
}

مرحله ی 3

ایجاد کلاسِ factory برای تولیدِ شی ای از کلاسِ concrete بر اساس اطلاعات داده شده.

ShapeFactory.java

import java.util.HashMap;

public class ShapeFactory {
   private static final HashMap<String, Shape> circleMap = new HashMap();

   public static Shape getCircle(String color) {
      Circle circle = (Circle)circleMap.get(color);

      if(circle == null) {
         circle = new Circle(color);
         circleMap.put(color, circle);
         System.out.println("Creating circle of color : " + color);
      }
      return circle;
   }
}

مرحله ی 4

از Factoryبا پاس دادن اطلاعاتی مثل color، برای گرفتن شیء از کلاسِ concrete استفاده میشه.

FlyWeightPatternDemo.java

public class FlyweightPatternDemo {
   private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };
   public static void main(String[] args) {

      for(int i=0; i < 20; ++i) {
         Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor());
         circle.setX(getRandomX());
         circle.setY(getRandomY());
         circle.setRadius(100);
         circle.draw();
      }
   }
   private static String getRandomColor() {
      return colors[(int)(Math.random()*colors.length)];
   }
   private static int getRandomX() {
      return (int)(Math.random()*100 );
   }
   private static int getRandomY() {
      return (int)(Math.random()*100);
   }
}

مرحله ی 5

بررسی خروجی

Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

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

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

مبحث آموزشی

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

Learn Design Patterns

سرفصل ها

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

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

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

https://telegram.me/softskill_ir

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

خبـرنــامه

Newsletters

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