Hello Design Pattern.

Design Pattern là các mẫu thiết kế có sẵn dùng để giải quyết một vấn đề cụ thể xuất hiện ở nhiều tính huống khác nhau . Một mẫu thiết kế tóm tắt các khía cạnh chính của một vấn đề hoặc một vấn đề thiết kế hướng đối tượng cụ thể đã được chứng minh là có hiệu quả theo thời gian.  Mẫu thiết kế được xây dựng từ kinh nghiệm phát triển ứng dụng lập trình hướng đối tượng, để tạo ra các chương trình linh hoạt hơn, mạnh mẽ hơn và dễ dàng mở rộng trong tương lai .

Trong IOS thì có khá nhiều Design Pattern phổ biến thường được sử dụng như là: MVC, Singleton, , Property, Delegation, Observer , Command, Visitor...

Trong bài viết này mình sẽ giới thiệu về Singleton Pattern, một pattern được thiết kế đơn giản nhất và cực kì phổ biến đối với IOS nói riêng và các ngôn ngữ lập trình khác nói chung.

Singleton có nghĩa là duy nhất, một Class có duy nhất một đối tượng trong vòng đời ứng dụng. Singleton được sử dụng như là một biến toàn cục có thể được sử dụng ở mọi nơi trong ứng dụng . Singleton cũng xuất hiện ở rất nhiều nơi trong ứng dụng từ các Framework của Apple, ví dụ như bạn sẽ thường thấy UIApplication.shared, FileManager.default, UserDefaults.Standard  …

Ví dụ bạn có một Class Database quản lý dữ liệu, và muốn mọi nơi trong ứng dụng đều truy xuất một Database duy nhất thì ta sẽ triển khai như sau:

class Database {

    private static var sharedDatabase: Database?

    static func shared() -> Database {

        if sharedDatabase == nil {

            sharedDatabase = Database()

        }

        return sharedDatabase!

    }

    var name = “database”

    func getAllUser() -> [User] {

        // Do something

    }

}

Sử dụng cực kì easy, ta chỉ cần gọi:   Database.shared().getAllUser()

Chú ý: Bởi vì Singleton là duy nhất nên chúng ta sẽ hạn chế việc có thể khởi tạo đối tượng nhiều lần bằng cách sử dụng function để return ra một biến private, và việc khởi tạo đối tượng này sẽ được che giấu bên trong class.  Ngoài việc sử dụng function shared() thì cũng có thể sử dụng một biến chỉ có getter để ngăn chặn khởi tạo nhiều lần:

static var shared: Database {
  if sharedDatabase == nil {
     sharedDatabase = Database()
  }

  return sharedDatabase!
}

Ưu điểm khi sử dụng Singleton:

1. Triển khai đơn giản.

2. Dễ sử dụng, có thể truy cập từ mọi nơi một cực kì nhanh chóng.

Nhược điểm:

1. Khó triển khai một cách hiệu quả để đảm bảo class chỉ có một đối tượng duy nhất.

2. Thread safe: Bởi vì là duy nhất nên có thể xảy ra trường hợp nhiều luồng cùng truy cập vào đối tượng này tại cùng một thời điểm dẫn đến kết quả sai, không như mong muốn . Chúng ta cũng có thể ngăn chặn sau khi hiểu rõ hơn về Multiple Task trong IOS, nội dung xử lý Thread safe thì mình sẽ giới thiệu sau này.

3. Khó quản lý dữ liệu vì được truy cập từ nhiều nơi khác nhau.

Lời kết

Singleton có lợi thế triển khai đơn giản, dễ sử dụng nhưng kèm theo đó có khá nhiều nhược nhiểm. Vì vậy hãy cân nhắc trước khi sử dụng singleton.