Saya telah mempelajari pola desain dan menemukan pola berat lalat. Saya telah mencoba melihat peluang untuk menggunakan pola dalam aplikasi saya, tetapi saya mengalami kesulitan melihat cara menggunakannya. Juga, apa saja tanda-tanda bahwa pola bobot terbang sedang digunakan ketika saya membaca kode orang lain?
Menurut definisi itu dikatakan:
Gunakan berbagi untuk mendukung sejumlah besar objek berbutir halus secara efisien.
Jika saya membacanya dengan benar Kamus dan Hashtable dapat menjadi contoh bobot terbang, apakah ini benar?
Terima kasih sebelumnya.
design-patterns
Jeremy E
sumber
sumber
Jawaban:
Salah satu contohnya adalah di perpustakaan Java. Java memiliki tipe primitif (misalnya
int
, yang merupakan bilangan bulat 32-bit) dan pembungkus untuk mereka (misalnyaInteger
, yang membungkusint
). Ada metode untuk "kotak"int
ke dalamInteger
dan menghapus kotakInteger
keint
. Pembungkus diperlukan karena tipe primitif bukan objek dan karenanya tidak dapat misalnya digunakan sebagai kunci diMap
s atau ditempatkan diCollection
s.Metode tinju menggunakan array objek kelas terbang sebagai jenis cache untuk
Integer
s yang sesuai denganint
nilai antara -128 dan 127. Karena itu adalah nilai yang paling mungkin digunakan sebagai kunci atau ditempatkan dalam koleksi, metode ini mengurangi alokasi dan penggunaan memori. (Jika ada 5000000Integer
yang mewakili nilai 0 melayang, yang menggunakan memori 50.000 kali lebih banyak daripada menggunakan kembali instance kelas terbang).sumber
Grafik. Biasanya, gambar raster (yang merupakan tulang punggung dari kebanyakan komputer grafis tingkat konsumen) adalah CPU-murah, tetapi memori-mahal untuk bekerja dengan (yang baik karena memori murah tetapi CPU mahal). Jika gambar raster itu harus diulang berkali-kali dalam merender UI yang lebih besar (dari ikon di aplikasi Windows GUI ke karakter font dalam pengolah kata, hingga tekstur pada permukaan pada game 3D), sangat masuk akal untuk muat gambar ke dalam memori satu kali, dan cukup tunjuk menggunakan objek yang sangat sederhana yang murah untuk dibuat dan jangan, sendiri, mengambil banyak memori. Sprite, yang hanya merupakan titik dalam ruang grafis di mana gambar harus ditampilkan, hanyalah titik 3D dan penunjuk memori ke piksel pertama dari gambar yang akan digunakan. MUNGKIN itu juga termasuk dimensi porsi file gambar sprite yang akan digunakan, baik secara grafis atau memori. Informasi ini semuanya sangat murah untuk diubah, katakanlah untuk mengubah gambar atau lokasi sprite, dan itu dapat dilakukan tanpa memuat gambar baru setiap kali, sehingga secara drastis meningkatkan kinerja program yang mendasarinya untuk memanipulasi dan menampilkan bagian yang tepat dari gambar yang tepat untuk membuat "adegan" UI lengkap.
sumber
Character
Contoh ASCII-range di Smalltalk adalah bobot terbang.Ketika Anda mengevaluasi sesuatu seperti
Character space
,Character class >> #value:
jalankan:Variabel kelas
CharacterTable
diinisialisasi seperti ini:Jadi, ketika Anda membuat sebuah String, rentang ASCII
Character
akan berasal dariCharacterTable
bukan yang baru dibuat setiap saat.sumber
Tujuan penggunaan pola bobot terbang adalah untuk menghindari inisialisasi objek yang tidak perlu dan dengan demikian menghemat ruang. Seperti yang didefinisikan oleh GOF , sebuah objek dapat memiliki dua status, kondisi intrinsik dan ekstrinsik:
Dengan asumsi bahwa kami ingin mengembangkan aplikasi editor teks sederhana di mana setiap kolom berisi semua baris teks dan baris dapat berisi karakter.
Dilema di sini adalah bagaimana merancang kelas Karakter. Di
char c
dalam kelas Karakter harus menjadi objek (keadaan intrinsik) utama. Namun, char dapat memiliki Font dan Ukuran (keadaan ekstrinsik); jadi kita perlu menyimpan status ekstrinsiknya di Row (klien) dan mengaksesnya saat diperlukan. Untuk tujuan ini, dua daftar yang menyimpan Font dan Ukuran dibuat.Dengan mengikuti pola Flyweight, Karakter sekarang dapat digunakan kembali dan objek direferensikan dari daftar objek tertentu (pool kelas terbang) yang berisi semua simbol ASCII (
Character
objek).Inilah yang saya jelaskan secara visual:
Untuk mencetak 'halo', hanya 4
Character
objek yang diperlukan, alih-alih 5. Setelah font diubah, tidak ada objek baru yang diperlukan; perhatikan bahwa ini tidak akan mungkin terjadi jika kami menyimpan keadaan ekstrinsik pada kelas Karakter, misalnya,Menerapkan pola ini pada dataset besar akan mengarah pada optimalisasi yang signifikan pada kompleksitas memori aplikasi dan penggunaan kembali objek.
sumber