Bay

New Member

Download miễn phí Bài giảng Từ một cho tới nhiều - Mẫu duy nhất singleton và mẫu flyweight





Mẫu ”hạng ruồi” flyweight giúp cho một đối tượng trông giống
nhiều đối tượng
Mẫu singleton nói về việc tạo một đối tượng duy nhất. Có một mẫu thiết kế khác cũng hạn chế
việc tạo đối tượng, nhưng lần này nó sẽ đem đến một cách thức khác trong việc viết mã. Đó là
mẫu “hạng ruồi” flyweight.
Mẫu thiết kế này gọi là “hạng ruồi” flyweight nguyên do thay vì phải làm việc với nhiều đối
tượng độc lập, to lớn, bạn giảm bớt kích thước chúng bằng việc tạo một tập hợp các đối tượng
dùng chung nhỏ hơn, gọi là flyweights mà bạn có thể cài đặt vào lúc thực thi chương trình để
chúng trông giống như những đối tượng lớn hơn. Mỗi đối tượng to lớn có thể tiêu tốn nhiều tài
nguyên hệ thống, bằng cách tách những điểm giống nhau của các đối tượng này, và dựa trên
việc cấu hình thời gian thực để mô phỏng lại các đối tượng lớn, bạn đã làm giảm bớt gánh
nặng lên tài nguyên hệ thống.
Bạn có thể đem những phần riêng biệt ra khỏi mã nguồn của những đối tượng to lớn và tạo ra
những đối tượng flyweight. Khi làm điều này, bạn đã chấm dứt việc sử dụng nhiều đối tượng có
chung các đặc điểm, và giảm xuống việc chỉ sử dụng một đối tượng, có thể cài đặt khi chương
trình thực thi, mô phỏng lại cả tập hợp các đối tượng to lớn ban đầu



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

CHƢƠNG V: TỪ MỘT CHO TỚI NHIỀU - MẪU
DUY NHẤT SINGLETON VÀ MẪU FLYWEIGHT
Trong chương này:
 Sử dụng mẫu duy nhất Singleton
 Ví dụ về Singleton
 Đồng bộ hóa để loại bỏ các vấn đề rắc rối trong đa luồng.
 Một cách tốt hơn để xử lý đa luồng
 Sử dụng mẫu “hạng ruồi” flyweight
Trong khả năng là một nhà tư vấn lương cao tại MegaGigaco, bạn phải xử lý các sự cố về hiệu
năng hệ thống. “Hệ thống hình như ngày càng chậm chạp hơn.” Các lập trình viên nói:
“Hmm,” bạn nói, “tui lưu ý các bạn rằng chúng ta đang có một cơ sở dữ liệu lớn, khoảng
20Mb”
“Vâng”, họ nói.
“Cùng một thời điểm, các bạn sử dụng bao nhiêu đối tượng này?”
“Khoảng 219”, các lập trình viên nói
“Trời, vậy các bạn sử dụng 219 đối tượng 20Mb trong lúc chương trình hoạt động?” Bạn nói.
“Chẳng lẽ không ai thấy được vấn đề ở đây à?”
“Không”, họ đồng thanh nói.
Bạn nói với họ “ các bạn sử dụng quá nhiều tài nguyên hệ thống. các bạn có hàng trăm đối
tượng to lớn mà máy tính phải xử lý. các bạn có thật sự cần tất cả chúng?”
“Vâng…” họ nói.
“tui nghĩ là không,” bạn nói. “tui sẽ sửa chữa vấn đề này bằng cách sử dụng mẫu duy nhất
Singleton.”
Chương này nói về việc kiểm soát số lượng đối tượng mà bạn phải tạo ra trong mã nguồn của
mình. Có hai mẫu thiết kế đặc biệt giúp ích cho bạn: mẫu duy nhất Singleton và mẫu “hạng
ruồi” flyweight.
Với mẫu duy nhất Singleton, bạn luôn chỉ có duy nhất một đối tượng cho một lớp cụ thể trong
suốt ứng dụng. Với mẫu “hạng ruồi” flyweight, bạn cũng có duy nhất một đối tượng cho một
lớp, nhưng có một chút khác biệt ở đây. Một thủ thuật được sử dụng ở đây.
Tạo một đối tƣợng duy nhất với mẫu duy nhất Singleton
tui bắt đầu với mẫu Singleton và xử lý rắc rối mà lập trình viên MegaGigaCo gặp phải. Họ
muốn chắn chắc rằng chỉ tạo duy nhất một đối tượng cho một lớp cụ thể mặc cho người khác
có cố gắng tạo bao nhiêu đối tượng đi nữa.
Các lập trình viên đang tạo ra hàng trăm đối tượng Database trong mã ngu62n, và rắc rối là
từng đối tượng này rất lớn. Đâu là giải pháp? Mẫu duy nhất Singeton là câu trả lời.
Mẫu duy nhất Singleton chắc chắn rằng bạn có thể khởi tạo chỉ duy nhất một đối tượng cho
một lớp. Nếu bạn không sử dụng mẫu thiết kế này, toán tử new như thường sử dụng, sẽ tạo ra
liên tiếp nhiều đối tượng mới như sau:
Ghi nhớ: Để chắc chắn rằng bạn chỉ có duy nhất một đối tượng, mặc cho người khác có hiện
thực bao nhiêu phiên bản đi nữa, hãy sử dụng mẫu duy nhất Singleton. Cuốn sách GoF nói
rằng, mẫu Singleton “Đảm bảo rằng một lớp chỉ có duy nhất một thể hiện và cung cấp một
biến toàn cục để truy cập nó”
Bạn sử dụng mẫu Singleton khi bạn muốn hạn chế việc sử dụng tài nguyên (thay vì việc tạo
không hạn chế số lượng đối tượng) hay khi bạn cần xử lý một đối tượng nhạy cảm, mà
dữ liệu của nó không thể chia sẻ cho mọi thể hiện, như registry của Windows chẳng hạn.
Gợi ý: Ngoài đối tượng bản ghi registry, bạn có thể sử dụng mẫu Singleton khi bạn muốn hạn
chế số lượng các thể hiện được tạo bởi vì bạn muốn chia sẻ dữ liệu của các đối tượng này. Ví
dụ như khi bạn có một đối tượng cửa sổ window hay hộp thoại dialog, cần hiện thị và thay
đổi dữ liệu, bạn sẽ không muốn tạo nhiều thể hiện của đối tượng này, vì bạn sẽ bị bối rối trong
việc phải truy cập dữ liệu của thể hiện nào.
Việc tạo một đối tượng duy nhất cũng rất quan trọng khi bạn sử dụng đa luồng và khi bạn
không muốn sự đụng độ dữ liệu xảy ra. Ví dụ bạn đang làm việc với một đối tượng cơ sở dữ
liệu, và các thể hiện khác cũng làm việc trên cùng cơ sở dữ liệu đó, việc đụng độ có thể gây ra
các vấn đề nghiêm trọng. tui sẽ thảo luận cách làm việc với mẫu Singleton và đa luồng trong
chương này.
Bất cứ khi nào bạn thật sự cần duy nhất một thể hiện của một lớp, hãy nghĩ tới mẫu Singleton
( thay vì dùng toán tử new ).
Một lớp cơ sở dữ liệu Database dựa trên kiểu Singleton
Đã bắt đầu để viết một ít mã nguồn. Bạn sẽ tạo một lớp tên Database mà các lập trình viên
trong công ty sẽ sử dụng. Lớp này có một hàm khởi dựng đơn giản, như mã sau:
Bạn cần thêm vào hai hàm editRecord, cho phép bạn chỉnh sửa một bản ghi, và hàm
getName, trả về tên gọi của Database.
Tới giờ mọi việc vẫn tốt đẹp. Bất cứ khi nào bạn tạo một đối tượng bằng toán tử new, một đối
tượng mới sẽ được tạo ra. Nếu bạn tạo 3 database, bạn sẽ có 3 đối tượng như sau:
Làm sao để bạn có thể tránh việc tạo một đối tượng mới khi sử dụng toán tử new? Đây là một
giải pháp – làm cho hàm khởi dụng riêng tư:
Điều này ngăn cản mọi người sử dụng hàm khởi dựng, ngoài trừ chính trong lớp này gọi tới.
Nhưng đợi một chút, có gì không ổn ở đây? Ai ở trên trái đất này lại cần có một hàm khởi dựng
riêng tư vậy?
Vậy làm sao bạn có thể tạo một đối tượng khi bạn không thể gọi hàm khởi tạo nó?
Bạn đã làm cho hàm khởi dựng trở nên riêng tư và cách duy nhất để phần còn lại của thế giới
khởi tạo đối tượng đó là thêm vào một hàm tạo đối tượng, và gọi nó khi bạn chắn chắn muốn
tạo một đối tượng duy nhất cho lớp này.
Hãy xem đoạn mã sau:
OK. Đầu tiên bạn ngăn chặn việc khởi tạo bằng toán tử new. Và bây giờ cách duy nhất là tạo
một hàm trong lớp để gọi việc khởi tạo đối tượng, thông thường hàm này có tên getInstance
(hay createInstance hay một cái tên cụ thể như createDatabase cũng được). Chú ý rằng hàm
này được gán phạm vi công cộng và toàn cục để bạn có thể truy cập tới nó thông qua tên lớp (
ví dụ như Database.getInstance()) (ND: public và static sẽ giúp cho hàm công cộng và toàn
cục, xem lại các khái niệm OOP )
Hàm này sẽ trả về một đối tượng Database, nhưng hàm chỉ hoạt động khi có ít nhất một đối
tượng đã tồn tại. Vì thế đầu tiên ta cần kiểm tra đối tượng này, tui gọi nó là singleObject, xem
nó đã tồn tại chưa? Nếu chưa, tui sẽ tạo nó. Và sau đó trả giá trị nó về cho hàm.
Vấn đề đã được giải quyết. Bây giờ chỉ có duy nhất một đối tượng Database tồn tại trong cùng
một thời điểm. ( Vấn đề đa luồng ta sẽ giải quyết trong phần sau của chương). Việc gọi hàm
getInstance sẽ cho ta một đối tượng như hình sau:
Khi bạn gọi getInstance lần nữa, bạn sẽ nhận được cùng một đối tượng như lần đầu.
Không quan tâm đến việc bạn gọi bao nhiêu lần getInstance, bạn luôn nhận được cùng một đối
tượng. Đó chính là cách bạn phải làm với mẫu singleton.
Chạy thử ví dụ với mẫu Singleton
Bắt đầu bằng việc tạo một đối tượng Database với tên là products, sau đó gọi hàm getName:
Sau đó bạn tiếp tục tạo một đối tượng Database với tên là employees, và gọi lại hàm getName
để kiểm tra:
Tuy nhiên đối tượng Database đã được tạo, vì vậy trong lần thứ hai, hàm getInstance vẫn trả
về đối tượng Database cũ, ...
 

Các chủ đề có liên quan khác

Top