Corak Flyweight di Jawa

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat corak reka bentuk flyweight. Corak ini digunakan untuk mengurangkan jejak memori. Ia juga dapat meningkatkan prestasi dalam aplikasi di mana keadaan objek mahal.

Ringkasnya, corak kelas terbang berdasarkan kilang yang mengitar semula objek yang dibuat dengan menyimpannya setelah dibuat. Setiap kali objek diminta, kilang mencari objek tersebut untuk memeriksa apakah objek tersebut sudah dibuat. Sekiranya ada, objek yang ada dikembalikan - jika tidak, objek baru dibuat, disimpan dan kemudian dikembalikan.

Keadaan objek flyweight terdiri dari komponen invarian yang dikongsi dengan objek serupa lainnya ( intrinsik ) dan komponen varian yang dapat dimanipulasi oleh kod klien ( ekstrinsik ).

Sangat mustahak bahawa objek berat terbang tidak berubah: sebarang operasi di negeri ini mesti dilakukan oleh kilang.

2. Pelaksanaan

Unsur utama corak adalah:

  • antara muka yang menentukan operasi yang dapat dilakukan oleh kod pelanggan pada objek flyweight
  • satu atau lebih pelaksanaan konkrit antara muka kami
  • kilang untuk mengendalikan instansiasi dan cache objek

Mari lihat bagaimana melaksanakan setiap komponen.

2.1. Antaramuka Kenderaan

Sebagai permulaan, kami akan membuat antara muka Kenderaan . Oleh kerana antara muka ini akan menjadi kaedah pengembalian kaedah kilang, kita perlu memastikan untuk mendedahkan semua kaedah yang berkaitan:

public void start(); public void stop(); public Color getColor();

2.2. Kenderaan Konkrit

Seterusnya, mari kita jadikan kelas Kereta sebagai Kenderaan konkrit . Kereta kami akan melaksanakan semua kaedah antara muka kenderaan. Untuk keadaannya, ia akan mempunyai mesin dan medan warna:

private Engine engine; private Color color;

2.3. Kilang Kenderaan

Akhir sekali, kami akan membuat VehicleFactory . Membina kenderaan baru adalah operasi yang sangat mahal sehingga kilang hanya akan membuat satu kenderaan setiap warna.

Untuk melakukan itu, kami terus melacak kenderaan yang dibuat menggunakan peta sebagai cache sederhana:

private static Map vehiclesCache = new HashMap(); public static Vehicle createVehicle(Color color) { Vehicle newVehicle = vehiclesCache.computeIfAbsent(color, newColor -> { Engine newEngine = new Engine(); return new Car(newEngine, newColor); }); return newVehicle; }

Perhatikan bagaimana kod pelanggan hanya dapat mempengaruhi keadaan ekstrinsik objek (warna kenderaan kita) yang meneruskannya sebagai hujah kepada kaedah createVehicle .

3. Kes Penggunaan

3.1. Pemampatan Data

Matlamat corak flyweight adalah untuk mengurangkan penggunaan memori dengan berkongsi sebanyak mungkin data, oleh itu, ia adalah asas yang baik untuk algoritma pemampatan tanpa kerugian. Dalam kes ini, setiap objek flyweight bertindak sebagai penunjuk dengan keadaan ekstrinsiknya sebagai maklumat yang bergantung pada konteks.

Contoh klasik penggunaan ini adalah dalam pemproses kata. Di sini, setiap watak adalah objek kelas terbang yang berkongsi data yang diperlukan untuk rendering. Akibatnya, hanya kedudukan watak di dalam dokumen yang memerlukan memori tambahan.

3.2. Data Caching

Banyak aplikasi moden menggunakan cache untuk meningkatkan masa tindak balas. Corak flyweight serupa dengan konsep inti cache dan dapat memenuhi tujuan ini dengan baik.

Sudah tentu, terdapat beberapa perbezaan utama dalam kerumitan dan pelaksanaan antara corak ini dan cache khas, umum.

4. Kesimpulan

Kesimpulannya, tutorial ringkas ini memfokuskan pada corak reka bentuk flyweight di Java. Kami juga memeriksa beberapa senario yang paling biasa yang melibatkan corak.

Semua kod dari contoh boleh didapati di projek GitHub.