Thursday, December 3, 2015

[Creational Pattern] Singleton pattern trong Objective C và Swift

Mình dự định viết một loạt bài về những design pattern trong iOS. Hy vọng chúng sẽ giúp ích cho các bạn khi lập trình cũng như phân tích hệ thống.

Software design patterns có 4 nhóm chính là:
  1. Creational patterns: tập hợp những loại pattern khởi tạo đối tượng.
  2. Structural patterns: tập hợp những loại pattern liên quan đến cấu trúc.
  3. Behavioral patterns: tập hợp những loại pattern liên quan đến những hành động giữa những đối tượng.
  4. Concurrency patterns: tập hợp những loại pattern liên quan việc xử lý đồng thời.

Pattern đầu tiên mình muốn giới thiệu với mọi người là Singleton Pattern thuộc Creational pattern. 

Khái niệm: Singleton Pattern dùng để khởi tạo một đối tượng (an instance) trong một lớp (a class).

Cấu trúc lớp:


Cách sử dụng:

- Nếu đối tượng mà bạn thường xuyên sử dụng trong ứng dụng bạn có thể dùng singleton pattern. Trước giờ mình hay dùng singleton pattern để tạo lớp quản lý những connection hay database.
- Bạn có thể ứng dụng singleton pattern vào những pattern như: Abstract FactoryBuilderPrototypeFacade và State objects.
- Singleton thường sử dụng trong Facade và State objects.

Code ví dụ trong Objective C: có những cách để tạo đối tượng theo singleton pattern như sau:

Các bạn nên dùng singleton theo 2 cách trên (GCD) hay (@synchronized).

Ngoài ra các bạn khi đọc code trên mạng có cách viết như sau: Các bạn không nên dùng cách này vì nó tạo singleton không nằm trong thread an toàn vì thế khi chạy multithread sẽ xảy ra crash ứng dụng. Các bạn bỏ đoạn code comment và viết đoạn code test như sau:
Khi chạy thì sẽ sinh crash ứng dụng như hình bên dưới:
 
Code ví dụ trong Swift:
bạn có thể viết như sau:
Cả 3 cách này trong swift đều hỗ trợ thread safety. Vì thế bạn dùng cách nào cũng được.

Tài liệu tham khảo:

  1. Raywenderlich
  2. Wikipedia
  3. Coasamurai blog
  4. Stackoverflow
  5. itmedia
  6. GCD in-depth

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.