Mod flyweight


Corak Flyweight digunakan terutamanya untuk mengurangkan bilangan objek yang dicipta untuk mengurangkan penggunaan memori dan meningkatkan prestasi. Corak reka bentuk jenis ini ialah corak struktur, yang menyediakan cara untuk mengurangkan bilangan objek dan dengan itu menambah baik struktur objek yang diperlukan oleh aplikasi.

Mod Flyweight cuba menggunakan semula objek sedia ada daripada jenis yang sama atau mencipta objek baharu jika tiada objek sepadan ditemui. Kami akan menunjukkan corak ini dengan mencipta 5 objek yang melukis 20 bulatan di lokasi yang berbeza. Memandangkan hanya terdapat 5 warna yang tersedia, sifat warna digunakan untuk menyemak objek Bulatan sedia ada.

Pengenalan

Niat: Gunakan teknologi perkongsian untuk menyokong sejumlah besar objek berbutir halus dengan berkesan.

Penyelesaian utama: Apabila terdapat sejumlah besar objek, ia mungkin menyebabkan limpahan memori Kami mengabstrak bahagian biasa Jika terdapat permintaan perniagaan yang sama, terus mengembalikan data yang telah disimpan dalam ingatan. Beberapa objek dielakkan daripada dicipta semula.

Bila hendak digunakan: 1. Terdapat sejumlah besar objek dalam sistem. 2. Objek ini menggunakan banyak memori. 3. Kebanyakan status objek ini boleh dieksternalisasi. 4. Objek ini boleh dibahagikan kepada banyak kumpulan mengikut keadaan intrinsiknya Apabila objek ekstrinsik dikeluarkan daripada objek, setiap kumpulan objek boleh digantikan dengan objek. 5. Sistem tidak bergantung pada identiti objek ini, dan objek ini tidak dapat dibezakan.

Cara menyelesaikan: Gunakan kod pengenalan unik untuk menilai Jika ia wujud dalam ingatan, kembalikan objek yang dikenal pasti oleh kod pengenalan unik.

Kod kunci: Gunakan HashMap untuk menyimpan objek ini.

Contoh aplikasi: 1 Rentetan dalam JAVA, jika wujud, kembalikannya, jika tidak, buat rentetan dan simpan dalam kolam cache rentetan. 2. Kumpulan data pangkalan data.

Kelebihan: Mengurangkan penciptaan objek dengan hebat, mengurangkan memori sistem dan meningkatkan kecekapan.

Kelemahan: Ia meningkatkan tanggungjawab sistem dan perlu memisahkan keadaan luaran dan keadaan dalaman, dan keadaan luaran mempunyai sifat semula jadi dan tidak sepatutnya berubah dengan perubahan keadaan dalaman.

Senario penggunaan: 1. 2. Senario yang memerlukan kolam penampan.

Nota: 1 Beri perhatian kepada membahagikan keadaan luaran dan keadaan dalaman, jika tidak, isu keselamatan benang mungkin berlaku. 2. Kelas ini mesti dikawal oleh objek kilang.

Pelaksanaan

Kami akan mencipta antara muka Bentuk dan kelas entiti Bulatan yang melaksanakan antara muka Bentuk. Langkah seterusnya ialah untuk menentukan kelas kilang ShapeFactory.

ShapeFactory mempunyai HashMap Bulatan dengan kuncinya ialah warna objek Bulatan. Setiap kali permintaan diterima, bulatan warna tertentu dibuat. ShapeFactory menyemak HashMapnya untuk objek bulatan dan jika objek Bulatan ditemui, ia dikembalikan, jika tidak, ia dicipta dan disimpan dalam peta cincang untuk kegunaan seterusnya baharu objek dan mengembalikan objek kepada klien.

FlyWeightPatternDemo, kelas demo kami menggunakan ShapeFactory untuk mendapatkan objek Shape. Ia akan menghantar maklumat (merah / hijau / biru / hitam / putih) kepada ShapeFactory untuk mendapatkan warna objek yang diperlukan.

flyweight_pattern_uml_diagram.jpg

Langkah 1

Buat antara muka.

Shape.java

public interface Shape {
   void draw();
}

Langkah 2

Buat kelas entiti yang melaksanakan antara muka.

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 kilang untuk menjana objek kelas entiti berdasarkan maklumat yang diberikan.

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

Langkah 4

Gunakan kilang ini untuk mendapatkan objek kelas entiti dengan menghantar maklumat 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

Sahkan output.

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