Ở đây chỉ có 2 loại ngôn ngữ: 1 là người phàn nàn và 1 là người không ai sử dụng. Edsger W. Dijkstra
STDIO Làm thế nào để hiện thực được một đối tượng tồn tại duy nhất song có thể truy xuất mọi lúc mọi nơi trong chương trình. Để giải bài toán trên, người ta hướng đến một giải pháp là sử dụng Singleton pattern.
Nội dung bài viết

Giới thiệu

Đôi khi, trong quá trình phân tích thiết kế một hệ thống, chúng ta chắc chắn được rằ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? Bạn có thể nghĩ tới việc sử dụng một biến toàn cục, tuy nhiên, việc 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”, còn khi xét về tính duy nhất của thể hiện thì biến toàn cục không làm được điều đó. Để giải bài toán trên, người ta hướng đến một giải pháp là sử dụng Singleton pattern – một mẫu thiết kế đáp ứng được cả hai yêu cầu trên.

Tiền đề bài viết

Trong quá trình học tập tại STDIO Training, một tiền bối đã đặt vấn đề này với tôi. Trước khi biết đến khái niệm về các mẫu thiết kế, thực sự, đối với tôi đó là một câu hỏi khó trả lời. Tuy nhiên, khi được gợi ý và chia sẻ, tôi thực sự thấy được sự kì diệu mẫu thiết kế. Bài viết với mong muốn, gửi tới bạn đọc một tư tưởng mới trong quá trình thiết kế mã nguồn; đồng thời khơi gợi sự thích thú khi tìm hiểu về phạm trù này.

Đối tượng hướng đến

Bài viết hướng đến những bạn độc giả bắt đầu tìm hiểu về mẫu thiết kế.

Design Pattern – Mẫu thiết kế

Trong kỹ thuật phần mềm, 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ể.

Thực tế có rất nhiều mẫu thiết kế từ đơn giản đến phức tạp nhằm hỗ trợ giải quyết các trường hợp khác nhau khi xây dựng mã nguồn chương trình. Tuy nhiên, trong phạm vi bài viết, tôi chỉ đề cập tới một trong những mẫu thiết kế đơn giản nhất đó là Singleton pattern.

Singleton Pattern

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

Singleton là một trong những mẫu thiết kế đơn giản nhất trong các mẫu thiết kế. Đây là mẫu thiết kế được áp dụng nhằm mục đích:

  • Xây dựng các lớp Singleton mà mỗi lớp 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. Nói cách khác, khi xây dựng lớp cần một kỹ thuật để có thể truy xuất được vào các thành viên public của lớp 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 lớp).

Để chắc chắn rằng, không có bất kỳ thể hiện nào bên ngoài lớp được tạo ra, constructor của lớp đó sẽ có phạm vi truy cập là private. Điều đó cũng có nghĩa là thể hiện duy nhất được tạo ra thông qua chính lớp mà chúng ta xây dựng. Vì vậy, ta sử dụng thành phần static để thực hiện điều này. Ta 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 lớp đó.

Mô hình

SP_DP

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() ta 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 lớp. Ví dụ để gọi phương thức method trong lớp ta dùng Singleton::getInstance()->method().

Ngoài ra, bạn có thể hiện thực Signgleton để thao tác với nhiều kiểu dữ liệu khác nhau trong C++. Chi tiết tham khảo bài viết Design Pattern: Singleton PatternDesign Pattern: Reference Counting.

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG