Salah satu corak struktur bertujuan untuk mengurangkan penggunaan memori dengan berkongsi data sebanyak mungkin dengan objek yang serupa.
Ia amat berguna apabila berurusan dengan sebilangan besar objek yang serupa, di mana mencipta tika baharu untuk setiap objek akan menjadi mahal dari segi penggunaan memori.
konsep utama:
Keadaan intrinsik: Keadaan yang dikongsi antara berbilang objek adalah bebas daripada konteks dan kekal sama merentas objek yang berbeza.
Keadaan ekstrinsik: Keadaan yang unik untuk setiap objek dan diluluskan daripada klien. Keadaan ini boleh berbeza-beza dan tidak disimpan dalam objek Flyweight
Peserta utama:
Flyweight: Antara muka yang objek Flyweight menerima keadaan Ekstrinsik dan menggunakannya.
ConcreteFlyweight: Melaksanakan Flyweight dan menyimpan keadaan intrinsik.
FlyweightFactory: Mengurus objek Flyweight dan memastikan perkongsian antara muka, ia mengembalikan Flyweight sedia ada jika ia sudah wujud.
Pelanggan(seperti kelas Utama): Mengekalkan rujukan kepada Flyweight dan membekalkan keadaan Ekstrinsik apabila ia perlu berinteraksi dengan objek Flyweight.
Mari kita ambil contoh objek Flyweight berwatak
Katakan kita mempunyai editor teks yang perlu menghasilkan sejumlah besar teks. Setiap watak boleh diwakili sebagai objek, tetapi mempunyai objek berasingan untuk setiap watak akan membuang banyak memori. Sebaliknya, kita boleh menggunakan Flyweights untuk berkongsi objek aksara yang mewakili setiap huruf dan menyimpan keadaan ekstrinsik seperti kedudukan atau pemformatan di luar
Berat Terbang
public interface Flyweight { public void display(int x, int y);//x, y are the extrinsic state of the Flyweight object }
ConcreteFlyweight
public class CharacterFlyweight implements Flyweight { private char ch; public CharacterFlyweight(char c){ this.ch = c; } @Override public void display(int x ,int y){ System.out.println("[drawing character: "+this.ch+" at co-ordinates:("+x+","+y+")]"); } }
FlyweightFactory
public class FlyweightFactory { private static HashMap<character> flyweights = new HashMap(); public static Flyweight getFlyweight(char c){ Flyweight flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new CharacterFlyweight(c); flyweights.put(c,flyweight); } return flyweight; } } </character>
Utama
public class Main { public static void main(String args[]){ Flyweight flyweight1 = FlyweightFactory.getFlyweight('a'); Flyweight flyweight2 = FlyweightFactory.getFlyweight('b'); Flyweight flyweight3 = FlyweightFactory.getFlyweight('a');// will use the same object that is referenced by flyweight1 flyweight1.display(1, 2);//'a' displayed at 1,2 flyweight2.display(3, 4);//'b' displayed at 3,4 flyweight3.display(5, 7); // 'a'(shared) displayed at 5,7 } }
Output:
[drawing character: a at co-ordinates:(1,2)] [drawing character: b at co-ordinates:(3,4)] [drawing character: a at co-ordinates:(5,7)]
Perkara Utama
Kelemahan
Kekompleksan: Corak boleh menambah kerumitan pada kod, terutamanya dalam mengurus keadaan ekstrinsik dan intrinsik secara berasingan.
Overhead: Jika terdapat sedikit objek untuk dikongsi, corak Flyweight mungkin memperkenalkan kerumitan yang tidak perlu tanpa penjimatan memori yang ketara.
Atas ialah kandungan terperinci Flyweight. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!