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