Search…

Design Pattern: Singleton Pattern

15/09/20202 min read
Hướng dẫn sử dụng Singleton pattern để hiện thực một đối tượng tồn tại duy nhất, có thể truy xuất mọi lúc mọi nơi trong chương trình.

Trong quá trình phân tích thiết kế một hệ thống, có những đối tượng cần tồn tại duy nhất song có thể truy xuất mọi lúc mọi nơi. Làm thế nào để hiện thực được một đối tượng như thế khi xây dựng mã nguồn?

Sử dụng biến toàn cục chỉ có thể đáp ứng được mặt “sử dụng mọi lúc mọi nơi”, khi xét tính duy nhất của thể hiện thì biến toàn cục không làm được điều đó.

Singleton pattern là một mẫu thiết kế đáp ứng được cả hai yêu cầu trên.

Design Pattern 

Mẫu thiết kế là một mô tả được áp dụng linh hoạt nhằm giải quyết một vấn đề trong nhiều tình huống thiết kế phần mềm cụ thể.

Singleton Pattern

Khái niệm và đặc điểm

Mục đích của singleton pattern:

  • Xây dựng các lớp Singleton mà mỗi class chỉ có duy nhất một thể hiện.
  • Có thể truy xuất được các thể hiện duy nhất đó mọi lúc mọi nơi trong chương trình.

Hiện thực

Khi hiện thực singleton pattern phải đảm bảo rằng chỉ có một thể hiện (instance) duy nhất được tạo ra và thể hiện tại có thể dùng mọi lúc mọi nơi. Khi xây dựng class cần một kỹ thuật để có thể truy xuất được vào các thành viên public của class mà không tạo ra một thể hiện nào (thông qua việc khởi tạo bên ngoài class).

Để chắc chắn không có bất kỳ thể hiện nào bên ngoài class được tạo ra, constructor của class đó sẽ có phạm vi truy cập là private, nghĩa là thể hiện duy nhất được tạo ra thông qua chính class được xây dựng. Sử dụng thành phần static để thực hiện điều này. Tạo một thể hiện của lớp kiểu private static và một refractor trả về đối tượng thuộc chính lớp đó.

Trong C++, singleton định nghĩa một thuộc tính static là một con trỏ trỏ tới thể hiện duy nhất của class đó.

Mô hình

Mô hình singleton pattern

Mã nguồn

Khai báo lớp Singleton

#include <iostream>
using namespace std;

class Singleton
{
private:
	static Singleton* m_instance;
	Singleton();
public:
	static Singleton* getInstance();
	void			method();
};

Định nghĩa lớp Singleton

#include "Singleton.h"

// Init static instance
Singleton* Singleton::m_instance = NULL;

Singleton* Singleton::getInstance()
{
	if (m_instance == NULL)
	{
		m_instance = new Singleton();
	}

	return m_instance;
}

void Singleton::method()
{
	cout << "This is singleton parttern";
}

Như vậy, thông qua các truy cập Singleton::getInstance(), luôn có một đối tượng duy nhất, đồng thời có thể sử dụng nó để truy cập mọi thành phần public trong class.

Ví dụ để gọi phương thức method trong class, sử dụng Singleton::getInstance()->method().

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024