Pola Desain - Pola Kelas Terbang

Pola kelas terbang terutama digunakan untuk mengurangi jumlah objek yang dibuat dan untuk mengurangi jejak memori dan meningkatkan kinerja. Jenis pola desain ini berada di bawah pola struktural karena pola ini menyediakan cara untuk mengurangi jumlah objek sehingga meningkatkan struktur objek aplikasi.

Pola kelas terbang mencoba menggunakan kembali objek sejenis yang sudah ada dengan menyimpannya dan membuat objek baru bila tidak ditemukan objek yang cocok. Kami akan mendemonstrasikan pola ini dengan menggambar 20 lingkaran dari lokasi berbeda tetapi kami hanya akan membuat 5 objek. Hanya 5 warna yang tersedia sehingga properti warna digunakan untuk memeriksa objek Circle yang sudah ada .

Penerapan

Kita akan membuat antarmuka Shape dan Circle kelas beton menerapkan antarmuka Shape . ShapeFactory kelas pabrik ditetapkan sebagai langkah berikutnya.

ShapeFactory memiliki HashMap dari Lingkaran memiliki kunci sebagai warna lingkaran objek. Setiap kali permintaan datang untuk membuat lingkaran dengan warna tertentu ke ShapeFactory , ia memeriksa objek lingkaran di HashMap -nya , jika objek Circle ditemukan, objek itu dikembalikan jika tidak, objek baru dibuat, disimpan dalam hashmap untuk digunakan di masa mendatang, dan dikembalikan ke klien.

FlyWeightPatternDemo , kelas demo kami, akan menggunakan ShapeFactory untuk mendapatkan objek Shape . Ini akan meneruskan informasi ( merah / hijau / biru / hitam / putih ) ke ShapeFactory untuk mendapatkan lingkaran warna yang diinginkan yang dibutuhkannya.

Langkah 1

Buat antarmuka.

Shape.java

public interface Shape {
   void draw();
}

Langkah 2

Buat kelas beton yang menerapkan antarmuka yang sama.

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);
   }
}

LANGKAH 3

Buat pabrik untuk menghasilkan objek kelas beton berdasarkan informasi yang diberikan.

ShapeFactory.java

import java.util.HashMap;

public class ShapeFactory {

   // Uncomment the compiler directive line and
   // javac *.java will compile properly.
   // @SuppressWarnings("unchecked")
   private static final HashMap 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;
   }
}

LANGKAH 4

Gunakan factory untuk mendapatkan objek kelas beton dengan melewatkan informasi seperti warna.

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);
   }
}

LANGKAH 5

Verifikasi hasilnya.

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