Tìm hiểu Singleton Design Pattern với ví dụ sử dụng ngôn ngữ C#
Đăng lúc: 09:41 AM - 27/10/2022 bởi Charles Chung - 941Singleton Design Pattern là một mẫu thiết kế thuộc nhóm Creational, nó đảm bảo rằng chỉ có một đối tượng cùng loại được tạo ra và sử dụng trong bất kỳ code nào sau đó.
Mô hình Singleton giải quyết 2 vấn đề
1. Đảm bảo rằng một lớp chỉ có một thực thể duy nhất . Tại sao mọi người lại muốn kiểm soát số lượng thực thể mà một lớp có? Lý do phổ biến nhất cho điều này là kiểm soát quyền truy cập vào một số tài nguyên được chia sẻ — ví dụ: cơ sở dữ liệu hoặc tệp. Đây là cách nó hoạt động: hãy tưởng tượng rằng bạn đã tạo một đối tượng, nhưng sau một thời gian quyết định tạo một đối tượng mới. Thay vì nhận một đối tượng mới, bạn sẽ nhận được một đối tượng mà bạn đã tạo. Lưu ý rằng hành vi này không thể thực hiện với một phương thức khởi tạo thông thường vì lời gọi phương thức khởi tạo phải luôn trả về một đối tượng mới theo thiết kế.
2. Cung cấp một điểm truy cập toàn cầu cho phiên bản đó . Hãy nhớ những biến toàn cục mà bạn đã sử dụng để lưu trữ một số đối tượng thiết yếu? Mặc dù chúng rất tiện dụng nhưng chúng cũng rất không an toàn vì bất kỳ mã nào cũng có khả năng ghi đè lên nội dung của các biến đó và làm hỏng ứng dụng. Cũng giống như một biến toàn cục, mẫu Singleton cho phép bạn truy cập một số đối tượng từ bất kỳ đâu trong chương trình. Tuy nhiên, nó cũng bảo vệ phiên bản đó không bị ghi đè bởi mã khác. Có một mặt khác của vấn đề này: bạn không muốn mã giải quyết vấn đề số 1 bị phân tán khắp chương trình của mình. Sẽ tốt hơn nhiều nếu có nó trong một lớp, đặc biệt nếu phần còn lại của mã của bạn đã phụ thuộc vào nó. Ngày nay, mô hình Singleton đã trở nên phổ biến đến mức mọi người có thể gọi một cái gì đó là singleton ngay cả khi nó chỉ giải quyết được một trong những vấn đề được liệt kê.
Giải pháp
Tất cả các triển khai của Singleton đều có hai bước chung sau:
- Đặt phương thức khởi tạo mặc định là riêng tư, để ngăn các đối tượng khác sử dụng newtoán tử với lớp Singleton.
- Tạo một phương thức tạo tĩnh hoạt động như một phương thức khởi tạo. Dưới mui xe, phương thức này gọi phương thức khởi tạo riêng để tạo một đối tượng và lưu nó trong một trường tĩnh. Tất cả các lệnh gọi sau đến phương thức này đều trả về đối tượng được lưu trong bộ nhớ cache.
Nếu mã của bạn có quyền truy cập vào lớp Singleton, thì nó có thể gọi phương thức tĩnh của Singleton. Vì vậy, bất cứ khi nào phương thức đó được gọi, cùng một đối tượng luôn được trả về.
Ví dụ sau đây được trình bày bằng code C#
//tạo lớp Database và không cho phép kế thừa
public sealed class Database
{
//khai báo biến tĩnh db
private static Database db;
//tạo constructor private (ngăn cấm việc tạo đối tượng)
private Database()
{
}
//tạo phương thức tĩnh để khởi tạo đối tượng của Database và trả về đối tượng đã tạo
public static Database GetInstance()
{
//nếu db is null thì tạo đối tượng
if (db == null)
db = new Database();
//trả về đối tượng
return db;
}
//các phương thức nghiệp vụ khác...
public string Query(string sql)
{
return sql+ " executed success!";
}
}
//Chương trình chính
class Program
{
static void Main(string[] args)
{
//lấy thể hiện db1 của database
Database db1 = Database.GetInstance();
//lấy thể hiện db2 của database
Database db2 = Database.GetInstance();
//kiểm tra xem db1 và db2 có là 1 không? => là 1 nhé
if(db1==db2)
{
Console.WriteLine("db1 va db2 cung mot instance");
}else
{
Console.WriteLine("db1 va db2 khac instance");
}
}
}
Link download source code C# (Google Drive)
Tham khảo và dịch tại: https://refactoring.guru/design-patterns/singleton các bạn có thể truy cập để đọc thêm nhé.
thay lời cảm ơn!
Các bài cũ hơn
- Truy xuất dữ liệu trong ASP.NET Core 2.1 sử dụng Entity Framework Core(Database First) (09:45 AM - 25/10/2022)
- Tổng quan về Design Pattern-Giới thiệu 23 mẫu Design Pattern trợ thủ đắc lực của Developers (10:31 AM - 24/10/2022)
- Làm thế nào để sử dụng JWT Authentication trong ASP.NET Core Web API kết hợp với SQL Server (02:51 PM - 21/10/2022)
- Giới thiệu về Json Web Token (JWT) (09:37 PM - 20/10/2022)