Singleton MẫuMẫu Singleton MẫuMẫu Singleton Singleton
GV. GV. Nguyễn
Nguyễn Minh Minh HuyHuy
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
1
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Singleton MẫuMẫu Singleton
cảnh:: (cid:1)(cid:1) NgữNgữ cảnh (cid:1)(cid:1) BàiBài toántoán::
tượng Application tượng Cookies
trong ứngứng dụng Application trong dụng.. Web Server. Cookies trêntrên Web Server.
(cid:2)(cid:2) ĐốiĐối tượng (cid:2)(cid:2) ĐốiĐối tượng Connection Pool. (cid:2)(cid:2) Connection Pool.
(cid:1)(cid:1) MụcMục tiêutiêu:: (cid:1)(cid:1) MụcMục tiêutiêu::
(instance). (cid:2)(cid:2) MộtMột lớplớp chỉchỉ cầncần cócó MỘT MỘT thểthể hiệnhiện (instance).
(cid:3)(cid:3) MởMở rộng
rộng: : mộtmột lớplớp chỉchỉ cầncần cócó xácxác địnhđịnh N N thểthể hiệnhiện.. dụng.. toàn ứngứng dụng được chỉachỉa sẻsẻ trêntrên toàn
(cid:2)(cid:2) CácCác thểthể hiệnhiện nàynày được
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
2
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) Hướng
Hướng tiếptiếp cậncận::
(cid:1)(cid:1) ChiaChia sẻsẻ thểthể hiệnhiện củacủa lớplớp trêntrên toàntoàn ứngứng dụngdụng:: static đểđể lưulưu mộtmột thểthể hiệnhiện củacủa lớplớp..
thuộc tínhtính static
(cid:2)(cid:2) DùngDùng thuộc
(cid:1)(cid:1) ĐảmĐảm bảobảo lớplớp chỉchỉ cócó MỘT MỘT thểthể hiệnhiện:: private. constructor vàovào tầmtầm vựcvực private.
(cid:2)(cid:2) ĐưaĐưa constructor (cid:2)(cid:2) CungCung cấpcấp hàmhàm static CungCung cấpcấp hàmhàm static (cid:3)(cid:3) ĐiềuĐiều khiển
khiển được
static đểđể trảtrả vềvề thểthể hiệnhiện đãđã lưulưu.. static đểđể trảtrả vềvề thểthể hiệnhiện đãđã lưulưu.. tượng.. khởi tạotạo đốiđối tượng
trình khởi
được quáquá trình
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
3
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
Singleton MẫuMẫu Singleton
void void mainmain()() {{
Cookies.getCookies getCookies()();;
(cid:1)(cid:1) CàiCài đặtđặt:: class Cookies class Cookies {{ private: private:
m_cookies;; Cookies* m_cookies
Cookies *c1 = Cookies *c1 = Cookies. cookiesX // // ThêmThêm cookiesX cookiesX // // BớtBớt cookiesX static Cookies* static Cookies();; Cookies()
public: public:
Cookies.getCookies Cookies.getCookies getCookies()();; getCookies()();; getCookies()() getCookies Cookies* getCookies getCookies()()
Cookies *c2 = Cookies *c2 = Cookies. Cookies *c2 = Cookies *c2 = Cookies. cookiesX // // ThêmThêm bớtbớt cookiesX static static Cookies* static static {{
}} m_cookies;; return m_cookies return
}}
};};
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
4
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
dùng chung // // KhởiKhởi tạotạo thểthể hiệnhiện dùng chung.. = new Cookies(); m_cookies = new Cookies(); Cookies* Cookies::m_cookies Cookies* Cookies::
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung
(cid:2)(cid:2) Thuộc
khởi tạotạo khikhi truytruy xuất
xuất lớplớp lầnlần đầuđầu..
không hiệuhiệu quảquả..
Thuộc tínhtính static (cid:3)(cid:3) SửSử dụng (cid:2)(cid:2) CáchCách thức
khởi tạotạo (cid:4)(cid:4) KhởiKhởi thểthể hiệnhiện dùngdùng chung khởi tạotạo (cid:4)(cid:4) KhởiKhởi thểthể hiệnhiện dùngdùng chung chung.. chung..
quanh:: xung quanh (lazy loading): (cid:1)(cid:1) KhởiKhởi tạotạo trễtrễ (lazy loading): được khởi static được dụng bộbộ nhớnhớ không khởi tạotạo trễtrễ:: thức khởi (cid:2)(cid:2) B1: B1: NếuNếu chưa chưa khởi chưa khởi (cid:2)(cid:2) B1: B1: NếuNếu chưa chung.. (cid:2)(cid:2) B2: B2: TrảTrả vềvề thểthể hiệnhiện dùngdùng chung
// // KhởiKhởi tạotạo NULL. NULL. Cookies* Cookies::m_cookies Cookies* Cookies:: = NULL; m_cookies = NULL;
getCookies()()
Cookies* Cookies:: Cookies* Cookies::getCookies {{
if (if (m_cookies
== NULL) m_cookies == NULL) = new Cookies(); m_cookies = new Cookies(); m_cookies
m_cookies;; return m_cookies return
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
5
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
}}
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung (cid:1)(cid:1) ChiaChia sẻsẻ đađa luồng (cid:2)(cid:2) VấnVấn đềđề truytruy xuất
quanh:: xung quanh threading): (multi--threading): luồng (multi thời trêntrên Cookies:: đồng thời xuất đồng
Cookies::getCookies
getCookies().().
Cookies* Cookies::getCookies() {
if (m_cookies == NULL) if (m_cookies == NULL)
Vùng không an toàn Vùng không an toàn Critical Section!!
m_cookies = new Cookies();
return m_cookies;
quyết:: (cid:2)(cid:2) CáchCách giảigiải quyết
(cid:2)(cid:2) DùngDùng MutexMutex.. Semaphore. (cid:2)(cid:2) DùngDùng Semaphore.
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
6
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
}
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung (cid:1)(cid:1) ChiaChia sẻsẻ đađa luồng
quanh:: xung quanh threading): (multi--threading): luồng (multi
(cid:2)(cid:2) DùngDùng MutexMutex trong
Visual C++: trong Visual C++:
* Cookies::m_mutex m_mutex = new
MutexMutex* Cookies:: Cookies* Cookies::m_cookies Cookies* Cookies:: = new MutexMutex();(); = NULL; m_cookies = NULL;
Cookies class Cookies class {{ private: private:
getCookies()() getCookies()()
Cookies* Cookies:: Cookies* Cookies::getCookies Cookies* Cookies:: Cookies* Cookies::getCookies {{
WaitOne();(); m_mutex;; static m_mutex;; static MutexMutex * * m_mutex static MutexMutex * * m_mutex static m_cookies;; static Cookies* m_cookies static Cookies* Cookies(); Cookies();
mutexmutex-->>WaitOne if (if (m_cookies public: public:
== NULL) m_cookies == NULL) = new Cookies(); m_cookies = new Cookies(); m_cookies static Cookies* getCookies static Cookies* getCookies();();
ReleaseMutex();(); };};
mutexmutex-->>ReleaseMutex m_cookies;; return m_cookies return
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
7
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
}}
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung (cid:1)(cid:1) ChiaChia sẻsẻ đađa luồng
quanh:: xung quanh threading): (multi--threading): luồng (multi Java: trong Java: synchronized trong
(cid:2)(cid:2) DùngDùng synchronized
Cookies class Cookies class {{
m_cookies;; final Cookies m_cookies
private static private static final Cookies Cookies();; private Cookies() private Cookies() private private Cookies();;
static synchronized synchronized Cookies Cookies getCookies getCookies()()
public public static {{
if (if (m_cookies == null) m_cookies == null)
= new Cookies(); m_cookies = new Cookies(); m_cookies
m_cookies;; return m_cookies return
}}
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
8
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
};};
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung (cid:1)(cid:1) ChiaChia sẻsẻ đađa luồng
quanh:: xung quanh threading): (multi--threading): luồng (multi
inner class (Bill Pugh, University of Maryland): (cid:2)(cid:2) DùngDùng inner class (Bill Pugh, University of Maryland):
Cookies class Cookies class {{
private static class CookiesHolder private static class public static final Cookies public static public static public static final Cookies CookiesHolder {{ final Cookies m_cookies final Cookies m_cookies = new Cookies(); m_cookies = new Cookies(); m_cookies = new Cookies(); = new Cookies();
}}
private Cookies(); private Cookies();
getCookies()()
public static Cookies getCookies public static Cookies {{
CookiesHolder.m_cookies;; return CookiesHolder.m_cookies return
}}
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
9
CuuDuongThanCong.com
https://fb.com/tailieudientucntt
};};
Singleton MẫuMẫu Singleton
(cid:1)(cid:1) CácCác vấnvấn đềđề xung
nguồn đểđể kiểmkiểm tratra..
Singleton tạotạo rara Global State
dụng.. trong ứngứng dụng
quanh:: xung quanh (unit testing): (cid:1)(cid:1) KiểmKiểm thửthử đơnđơn vịvị (unit testing): (cid:2)(cid:2) CôCô lậplập cáccác đơnđơn vịvị mãmã nguồn (cid:2)(cid:2) Singleton (cid:3)(cid:3) GâyGây khókhó khăn
(cid:1)(cid:1) MẫuMẫu nênnên tránh (cid:1)(cid:1) MẫuMẫu nênnên tránh
nguồn.. trong mãmã nguồn
chồng chéo
chồng chéo toàn trong
Global State trong khăn chocho việcviệc kiểmkiểm thửthử đơnđơn vịvị.. (anti--pattern): pattern): (anti--pattern): pattern): chéo trong chéo bịbị cheche dấudấu.. dụng đađa luồng luồng.. trong ứngứng dụng khăn.. Global State làmlàm kiểmkiểm thửthử khókhó khăn Singleton mộtmột cáchcách cẩncẩn trọng
tránh (anti tránh (anti (cid:2)(cid:2) TạoTạo liênliên kếtkết chồng (cid:2)(cid:2) LiênLiên kếtkết chồng (cid:2)(cid:2) Không Không an an toàn (cid:2)(cid:2) TạoTạo Global State (cid:3)(cid:3) DùngDùng Singleton
trọng!!!!
Mẫu thiết kế hướng đối tượng & ứng dụng - Nguyễn Minh Huy
10
CuuDuongThanCong.com
https://fb.com/tailieudientucntt