Bài giảng Mẫu thiết kế hướng đối tượng và ứng dụng: Mẫu Singleton trình bày ngữ cảnh mẫu Singleton, hướng tiếp cận mẫu Singleton, cài đặt, các vấn đề xung quanh mẫu Singleton. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1GV
GV NguyễnNguyễn Minh Minh HuyHuy
Mẫu
Trang 2Ngữ Ngữ cảnh cảnh::
Bài Bài toán toán::
ĐốiĐối tượngtượng Application Application trongtrong ứngứng dụngdụng
ĐốiĐối tượngtượng Cookies Cookies trêntrên Web Server.Web Server
Connection Pool
Mục Mục tiêu tiêu::
Mục Mục tiêu tiêu::
MộtMột lớplớp chỉchỉ cầncần cócó MỘT MỘT thểthể hiệnhiện (instance).(instance)
MởMở rộngrộ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
CácCác thểthể hiệnhiện nàynày đượcđược chỉachỉa sẻsẻ trêntrên toàntoàn ứngứng dụngdụng
Trang 3Hướng Hướng tiếp tiếp cận cận::
Chia Chia sẻ sẻ thể thể hiện hiện của của lớp lớp trên trên toàn toàn ứng ứng dụng dụng::
DùngDùng thuộcthuộc tínhtính static static đểđể lưulưu mộtmột thểthể hiệnhiện củacủa lớplớp
Đảm Đảm bảo bảo lớp lớp chỉ chỉ có có MỘT MỘT thể thể hiện hiện::
ĐưaĐưa constructor constructor vàovào tầmtầm vựcvực private.private
Cung Cung cấpcấp hàmhàm static static đểđể trảtrả vềvề thểthể hiệnhiện đãđã lưulưu
CungCung cấpcấp hàmhàm static static đểđể trảtrả vềvề thểthể hiệnhiện đãđã lưulưu
ĐiềuĐiều khiểnkhiển đượcđược quáquá trìnhtrình khởikhởi tạotạo đốiđối tượngtượng
Trang 4Cài Cài đặt đặt::
class
class Cookies Cookies
{{
private:
static static Cookies* Cookies* m_cookies m_cookies;;
Cookies()
Cookies();;
public:
static getCookies getCookies() ()
void
void main main()() {{
Cookies *c1 =
Cookies *c1 = Cookies.Cookies.getCookies getCookies() ();;
//
// Thêm Thêm cookiesX cookiesX //
// Bớt Bớt cookiesX cookiesX Cookies *c2 = Cookies *c2 = Cookies.Cookies.getCookies getCookies() ();; static
static Cookies* Cookies* getCookies getCookies() ()
{{
return return m_cookies m_cookies;;
}}
};
//
// Khởi Khởi tạo tạo thể thể hiện hiện dùng dùng chung chung
Cookies* Cookies::
Cookies* Cookies::m_cookies m_cookies = new Cookies();= new Cookies();
Cookies *c2 =
Cookies *c2 = Cookies.Cookies.getCookies getCookies() ();;
//
// Thêm Thêm bớt bớt cookiesX cookiesX }}
Trang 5Các Các vấn vấn đề đề xung xung quanh quanh::
Khởi Khởi tạo tạo trễ trễ (lazy loading): (lazy loading):
ThuộcThuộc tínhtính static static đượcđược khởikhởi tạotạo khikhi truytruy xuấtxuất lớplớp lầnlần đầuđầu
SửSử dụngdụng bộbộ nhớnhớ khôngkhông hiệuhiệu quảquả
CáchCách thứcthức khởikhởi tạotạo trễtrễ::
B1: B1: Nếu Nếu chưa chưa khởi khởi tạo tạo Khởi Khởi thể thể hiện hiện dùng dùng chung chung
B1: B1: Nếu Nếu chưa chưa khởi khởi tạo tạo Khởi Khởi thể thể hiện hiện dùng dùng chung chung
B2: B2: Trả Trả về về thể thể hiện hiện dùng dùng chung chung
//
// Khởi Khởi tạo tạo NULL NULL.
Cookies* Cookies::
Cookies* Cookies::m_cookies m_cookies = NULL;= NULL;
Cookies* Cookies::
Cookies* Cookies::getCookies getCookies() ()
{{
if (
if (m_cookies m_cookies == NULL) == NULL)
m_cookies m_cookies = new Cookies(); = new Cookies();
Trang 6Các Các vấn vấn đề đề xung xung quanh quanh::
Chia Chia sẻ sẻ đa đa luồng luồng (multi (multi threading): threading):
VấnVấn đềđề truytruy xuấtxuất đồngđồng thờithời trêntrên Cookies::Cookies::getCookiesgetCookies().()
Cookies* Cookies::getCookies()
{
if (m_cookies == NULL) Vùng không an toàn
CáchCách giảigiải quyếtquyết::
Dùng Dùng Mutex Mutex
Dùng Dùng Semaphore Semaphore.
if (m_cookies == NULL)
m_cookies = new Cookies();
return m_cookies;
}
Vùng không an toàn Critical Section!!
Trang 7Các Các vấn vấn đề đề xung xung quanh quanh::
Chia Chia sẻ sẻ đa đa luồng luồng (multi (multi threading): threading):
DùngDùng MutexMutex trongtrong Visual C++:Visual C++:
class
class Cookies Cookies
{{
private:
static
static Mutex Mutex * * m_mutex m_mutex;;
Mutex Mutex* Cookies::* Cookies::m_mutex m_mutex = new = new Mutex Mutex();(); Cookies* Cookies::
Cookies* Cookies::m_cookies m_cookies = NULL; = NULL;
Cookies* Cookies::
Cookies* Cookies::getCookies getCookies() ()
static
static Mutex Mutex * * m_mutex m_mutex;;
static Cookies*
static Cookies* m_cookies m_cookies;;
Cookies();
public:
static Cookies*
static Cookies* getCookies getCookies(); ();
};
Cookies* Cookies::
Cookies* Cookies::getCookies getCookies() ()
{{
mutex mutex > >WaitOne WaitOne(); ();
if (
if (m_cookies m_cookies == NULL) == NULL)
m_cookies m_cookies = new Cookies(); = new Cookies();
mutex mutex > >ReleaseMutex ReleaseMutex(); ();
return return m_cookies m_cookies;;
}}
Trang 8Các Các vấn vấn đề đề xung xung quanh quanh::
Chia Chia sẻ sẻ đa đa luồng luồng (multi (multi threading): threading):
DùngDùng synchronized synchronized trongtrong Java:Java:
class
class Cookies Cookies
{{
private
private static static final Cookies final Cookies m_cookies m_cookies;;
private
private Cookies() Cookies();;
private
private Cookies() Cookies();;
public
public static static synchronized synchronized Cookies Cookies getCookies getCookies() ()
{{
if (
if (m_cookies m_cookies == null) == null)
m_cookies
m_cookies = new Cookies(); = new Cookies();
return return m_cookies m_cookies;;
}}
};
Trang 9Các Các vấn vấn đề đề xung xung quanh quanh::
Chia Chia sẻ sẻ đa đa luồng luồng (multi (multi threading): threading):
DùngDùng inner class (Bill Pugh, University of Maryland):inner class (Bill Pugh, University of Maryland):
class
class Cookies Cookies
{{
private static class
private static class CookiesHolder CookiesHolder {{
public static public static final Cookies final Cookies m_cookies m_cookies = new Cookies();= new Cookies();
public static
public static final Cookies final Cookies m_cookies m_cookies = new Cookies();= new Cookies();
}}
private Cookies();
public static Cookies
public static Cookies getCookies getCookies() ()
{{
return
return CookiesHolder.m_cookies CookiesHolder.m_cookies;;
Trang 10Các Các vấn vấn đề đề xung xung quanh quanh::
Kiểm Kiểm thử thử đơn đơn vị vị (unit testing): (unit testing):
Cô lậpCô lập cáccác đơnđơn vịvị mãmã nguồnnguồn đểđể kiểmkiểm tratra
Singleton Singleton tạotạo rara Global State Global State trongtrong ứngứng dụngdụng
GâyGây khókhó khănkhăn chocho việcviệc kiểmkiểm thửthử đơnđơn vịvị
Mẫu Mẫu nên nên tránh tránh (anti (anti pattern): pattern):
Mẫu Mẫu nên nên tránh tránh (anti (anti pattern): pattern):
TạoTạo liênliên kếtkết chồngchồng chéochéo trongtrong mãmã nguồnnguồn
LiênLiên kếtkết chồngchồng chéochéo bịbị cheche dấudấu
KhôngKhông an an toàntoàn trongtrong ứngứng dụngdụng đađa luồngluồng
TạoTạo Global State Global State làmlàm kiểmkiểm thửthử khókhó khănkhăn
DùngDùng Singleton Singleton mộtmột cáchcách cẩncẩn trọngtrọng!!!!