Flyweight Pattern

Một phần của tài liệu hệ thống các mẫu design pattern (Trang 30 - 32)

- Mô hình mẫu

3.6. Flyweight Pattern

- Ý nghĩa

Làm phương tiện dùng chung để quản lý một cách hiệu quả một số lượng lớn các đối tượng nhỏ có các đặc điểm chung, mà các đối tượng nhỏ này lại được sử dụng tuỳ thuộc vào hoàn cảnh, điều kiện ngoài.

- Mô hình mẫu

Trong đó:

o FlyweightFactory: tạo ra và quản lý các đối tượng Flyweight o Flyweight là một giao tiếp định nghĩa các phương thức chuẩn

o ConcreteFlyweightX: là các lớp thực thi của Flyweight, các thể hiện của các lớp này sẽ được sử dụng tuỳ thuộc vào điều kiện ngoài.

- Trường hợp sử dụng

o Ứng dụng sử dụng nhiều đối tượng giống hoặc gần giống nhau

o Với các đối tượng gần giống nhau, những phần không giống nhau có thể tách rời với các phần giống nhau để cho phép các phần giống nhau có thể chia sẻ

o Nhóm các đối tượng gần giống nhau có thể được thay thế bởi một đối tượng chia sẻ mà các phần không giống nhau đã được loại bỏ

o Nếu ứng dụng cần phân biệt các đối tương gần giống nhau trong trạng thái gốc của chúng - Ví dụ mẫu

Một ví dụ cổ điển của mẫu flyweight là các kí tự được lưu trong một bộ xử lí văn bản (word processor). Mỗi kí tự đại diện cho một đối tượng mà có dữ liệu là loại font (font face), kích thước font, và các dữ liệu định dạng khác. Bạn có thể tưởng tượng là, với một tài liệu (document) lớn với cấu trúc dữ liệu như thế này thì sẽ bộ xử lí văn bản sẽ khó mà có thể xử lí được. Hơn nữa, vì hầu hết dữ liệu dạng này là lặp lại, phải có một cách để giảm việc lưu giữ này – đó chính là mẫu Flyweight. Mỗi đối tượng kí tự sẽ chứa một tham chiếu đến một đối tượng định dạng riêng rẽ mà chính đối tượng này sẽ chứa các thuộc tính cần thiết. Điều này sẽ giảm một lượng lớn sự lưu giữ bằng cách kết hợp mọi kí tự có định dạng giống nhau trở thành các đối tượng đơn chỉ chứa tham chiếu đến cùng một đối tượng đơn chứa định dạng chung đó.

Giao tiếp Character định nghĩa phương thức vẽ một kí tự

public interface Character { public void draw(); }

//Lớp kí tự thực thi từ giao tiếp Character

//Sở dĩ ta định nghĩa Character và ConcreteCharacter riêng là vì trong cấu trúc sẽ có một phần nữa: phần không giống nhau giữa các đối tượng Character (mà ta không bàn tới)

public class ConcreteCharacter implements Character { private String symbol;

private String font;

public ConcreteCharacter(String s, String f) { this.symbol = s;

this.font = f; }

public void draw() {

System.out.println("Symbol " + this.symbol + " with font " + this.font); }

}

//Lớp khởi tạo các kí tự theo symbol và font, mỗi lần khởi tạo nó sẽ lưu các đối tượng này vào vùng nhớ riêng của nó, nếu đối tượng ký tự symbol + font đã có thì nó sẽ lấy ra chứ không khởi tạo lại

public class CharacterFactory {

private Hashtable pool = new Hashtable<String, Character>();

public int getNum() {

return pool.size(); }

public Character get(String symbol, String fontFace) { Character c;

String key = symbol + fontFace;

if ((c = (Character)pool.get(key)) != null) { return c;

} else {

c = new ConcreteCharacter(symbol, fontFace); pool.put(key, c);

return c; } } } //Lớp Test import java.util.*

public class Test {

public static void main(String[] agrs) {

CharacterFactory characterfactory = new CharacterFactory(); ArrayList<Character> text = new ArrayList<Character>(); text.add(0, characterfactory.get("a", "arial"));

text.add(1, characterfactory.get("b", "time")); text.add(2, characterfactory.get("a", "arial")); text.add(0, characterfactory.get("c", "arial")); for (int i = 0; i < text.size(); i++) {

Character c = (Character) text.get(i); c.draw();

} } }

Như vậy ‘a’ + ‘arial’ gọi 2 lần như chỉ khởi tạo có 1 lần mà thôi

Một phần của tài liệu hệ thống các mẫu design pattern (Trang 30 - 32)

Tải bản đầy đủ (PDF)

(34 trang)