Đô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.
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. (The singleton pattern is a design pattern that restricts the instantiation of a class to one object.)
-
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
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()
Nguồn bài viết: http://www.stdio.vn/articles/read/224/singleton-pattern
Đọc thêm các bài viết liên quan, nếu bạn vẫn còn khúc mắc nào về Singleton Pattern:
http://www.daonho.com/2014/04/singleton-design-pattern.html (Giới thiệu về Singleton Pattern.)
http://www.daonho.com/2014/04/singleton-design-pattern-trong-java.html (Triển khai Singleton Pattern bằng Java.)
http://www.daonho.com/2014/04/design-patterns-la-gi.html
Một ứng dụng thường thấy của Singleton Pattern là Logging Class trong các ứng dụng.
http://stackoverflow.com/questions/228164/on-design-patterns-when-to-use-the-singleton
Anti-Pattern là gì?
Dự định của mình là đọc các quyển sách viết về Đạo lập trình cũng như xây dựng các thói quen tốt khi Lập trình trước khi đọc các quyển về Design Pattern. (Nếu bản thân mình không minh định được thế nào là tốt thì làm sao biết các Design Pattern này tốt ở điểm nào chứ?)
Các quyển sách dự định sẽ đọc:
- Code Complete (2nd Edititon)
- Clean Code
- Clean Coder
- The Pragmatic Programmer - From Journeyman to Master
- The Passionate Programmer, 2nd edition
- Kỹ thuật & tư duy lập trình - Craftman (Bản dịch tiếng Việt của HVA)
Các quyển đã đọc
- How to be a Programmer: A Short, Comprehensive, and Personal Summary.
- Programmer’s motivation for Beginners.