STDIO
Tìm kiếm gần đây

    Nội dung

    Design Pattern: Singleton Pattern

    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.

    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ài viết liên quan

    Design Pattern: Singleton Pattern

    Singleton Pattern là một trong những Design Pattern rất phổ biến trong phát triển game cũng như ứng dụng. Trong kỹ thuật phần mềm, Singleton là một mẫu thiết kế nhằm hạn ...

    Hoàng Thái07/09/2015

    Design Pattern: Abstract Factory Pattern

    Được phát triển dựa trên kiến thức đa hình trong phương pháp lập trình hướng đối tượng. Abstract Factory là một trong những Design Pattern thông dụng, làm các đoạn mã trở ...

    Lê Minh Trung01/06/2015

    Design Pattern: Proxy Pattern

    Proxy Pattern là một trong những Design Pattern thường được áp dụng khi phát triển phần mềm cũng như thiết kế game, là một mẫu thiết kế thuộc nhóm Structural patterns. ...

    Huỳnh Minh Tân18/10/2017

    Design Pattern: Builder Pattern

    Builder Pattern là một trong những Design Pattern phổ biến trong thiết kế và phát triển các phần mềm ứng dụng cũng như games. Bài viết sẽ cung cấp các kiến thức ...

    Nguyễn Thị Trúc Linh05/02/2017

    Design Pattern: Prototype Pattern

    Prototype Pattern là một trong những Pattern phổ biến trong lập trình hướng đối tượng, là một Pattern thuộc nhóm Creational Patterns. Ý tưởng này là một design pattern ...

    Tran Khanh Nguyen25/03/2017

    Design Pattern: Adapter Pattern

    Trong lập trình hướng đối tượng, một khái niệm cực kì quan trọng đó là “giao diện của lớp” . Trong bài viết này sẽ đề cập đến một design pattern được sử dụng rất phổ biến ...

    Hoàng Tiến Đạt28/11/2014

    Design Pattern: Dependency Injection

    Khi thực hiện những dự án với độ phức tạp cao ngoài việc thiết kế tính năng cho ứng dụng, tổ chức code luôn luôn là vấn đề được đặt lên hàng đầu. Tổ chức tốt giúp lập ...

    Trần Thị Thu Hiền28/12/2014

    Design Pattern: State Pattern

    Trong quá trình làm game ở trường, tôi gặp phải một vấn đề khó khăn trong việc xử lý các trạng thái của đối tượng khiến công việc trở nên phức tạp và khó hiểu. Nhưng nhờ ...

    Hoàng Thái06/09/2015

    Design Pattern: Factory Pattern

    Factory Pattern là một trong những Pattern phổ biến trong lập trình hướng đối tượng. Khi một chương trình có nhiều đối tượng, việc quản lý khởi tạo các đối tượng đó sẽ ...

    Nguyễn Minh Hiếu26/07/2015

    Design Pattern: Reference Counting

    C++ là một ngôn ngữ lập trình mạnh mẽ và được sử dụng rộng rãi hiện nay. Tuy nhiên, nếu lập trình viên thiếu kinh nghiệm hoặc không cẩn thận khi lập trình sẽ dễ dẫn đến ...

    Rye Nguyen04/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    [email protected]

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020