Adakah yang punya contoh spesifik menggunakan Pola Bobot Terbang? [Tutup]

21

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.

Jeremy E
sumber
7
Hanya sedikit anekdot tentang flyweights: Saya pernah harus membuat file excel besar (hingga 500k catatan, lebih dari 100 kolom) dengan API pihak ke-3. Gaya untuk sel menjadi sangat intensif memori. Jadi setiap kali gaya diperlukan, hashtable diperiksa jika gaya yang sama sudah ada dan kemudian hanya menyediakan referensi untuk gaya ini. Modifikasi ini memungkinkan ekspor ini. Sekarang memiliki banyak data di excel adalah kegilaan menurut saya. Tetapi pengendali memiliki makro analisis yang ingin mereka pertahankan.
Falcon
9
Komentar: Saya harap orang-orang yang menulis buku pola dan OO dan artikel datang ke dunia nyata dari programmer rata-rata dan berhenti menggunakan gaya bahasa Inggris pengacara!
NoChance
1
"Saya pernah harus membuat file excel besar (hingga 500 ribu catatan, lebih dari 100 kolom)" - itu tidak banyak dibandingkan dengan apa yang mampu dibuat oleh beberapa pedagang ;-)
quant_dev
Setelah membaca beberapa contoh ini saya akan berpikir dalam kompresi data memori akan menjadi tempat yang bagus untuk menerapkan teknik ini. Terima kasih untuk bantuannya!
Jeremy E
Sel tabel di GWT adalah bobot terbang.
user16764

Jawaban:

19

Salah satu contohnya adalah di perpustakaan Java. Java memiliki tipe primitif (misalnya int, yang merupakan bilangan bulat 32-bit) dan pembungkus untuk mereka (misalnya Integer, yang membungkus int). Ada metode untuk "kotak" intke dalam Integerdan menghapus kotak Integerke int. Pembungkus diperlukan karena tipe primitif bukan objek dan karenanya tidak dapat misalnya digunakan sebagai kunci di Maps atau ditempatkan di Collections.

Metode tinju menggunakan array objek kelas terbang sebagai jenis cache untuk Integers yang sesuai dengan intnilai 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 5000000 Integeryang mewakili nilai 0 melayang, yang menggunakan memori 50.000 kali lebih banyak daripada menggunakan kembali instance kelas terbang).

Peter Taylor
sumber
1
Jadi kumpulan intern untuk string dalam C # adalah contoh lain dari pola bobot terbang yang benar?
Jeremy E
1
@ Jeremy E: Ya, menurut pendapat saya, Anda dapat memanggil string magang aplikasi dari pola terbang, meskipun untuk string, ini bukan hanya tentang konsumsi memori, tetapi juga tentang efisiensi runtime.
Falcon
Pointer tag objektif-C menjadikan ini ekstrem. Bilangan bulat kotak hingga 56 bit, dan banyak string hingga enam karakter, bahkan tidak dialokasikan sebagai objek, tetapi semua informasi dikemas ke dalam pointer objek itu sendiri.
gnasher729
9

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.

KeithS
sumber
3

CharacterContoh ASCII-range di Smalltalk adalah bobot terbang.

Ketika Anda mengevaluasi sesuatu seperti Character space, Character class >> #value:jalankan:

value: anInteger 
    "Answer the Character whose value is anInteger."

    anInteger > 255 ifTrue: [^self basicNew setValue: anInteger].
    ^ CharacterTable at: anInteger + 1.

Variabel kelas CharacterTablediinisialisasi seperti ini:

initialize
    "Create the table of unique Characters, and DigitsValues."
    "Character initializeClassificationTable"

    CharacterTable ifNil: [
        "Initialize only once to ensure that byte characters are unique"
        CharacterTable := Array new: 256.
        1 to: 256 do: [:i | CharacterTable
            at: i
            put: (self basicNew setValue: i - 1)]].
    self initializeDigitValues

Jadi, ketika Anda membuat sebuah String, rentang ASCII Characterakan berasal dari CharacterTablebukan yang baru dibuat setiap saat.

Frank Shearar
sumber
3

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:

  • Keadaan intrinsik: Disimpan dalam kelas terbang; itu terdiri dari informasi yang independen pada konteks kelas terbang, sehingga membuatnya dapat dibagikan.
  • Keadaan ekstrinsik: tergantung dan bervariasi dengan konteks kelas terbang dan karenanya tidak dapat dibagikan. Objek klien bertanggung jawab untuk melewati status ekstrinsik ke kelas terbang ketika dibutuhkan.

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 cdalam 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 ( Characterobjek).

Inilah yang saya jelaskan secara visual:

masukkan deskripsi gambar di sini

Untuk mencetak 'halo', hanya 4 Characterobjek 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,

class Character
{
    char c;
    int Size;
    Font font;

    ....
}

Menerapkan pola ini pada dataset besar akan mengarah pada optimalisasi yang signifikan pada kompleksitas memori aplikasi dan penggunaan kembali objek.

Menelaos Kotsollaris
sumber