[Nhóm Creational] Mẫu Abstract Factory



Mẫu Abstract Factory



I. Khái niệm
Mẫu Abstract Factory bao gồm một lớp Factory trừu tượng (là interface hoặc lớp abstract) và các lớp con Factory cụ thể có chức năng tạo ra một tập hợp các đối tượng Product có liên quan hoặc phụ thuộc lẫn nhau.
Trong đó:
AbstractFactory: định nghĩa một lớp trừu tượng cho việc khởi tạo các "sản phẩm" ảo (AbstractProduct).
ConcreteFactory: là lớp con kế thừa AbstractFactory để tạo ra "sản phẩm" cụ thể.
AbstractProduct: định nghĩa một lớp trừu tượng cho một loại đối tượng "sản phẩm".
Product: là lớp con kế thừa từ lớp "sản phẩm" ảo AbstractProduct, là các "sản phẩm" cụ thể.
Client: sử dụng các lớp AbstractFactory và AbstractProduct trong hệ thống.

II. Tần suất sử dụng
Cao 

III. Ví dụ tình huống
Giả sử ta có lớp điện thoại và lớp máy tính, trong mỗi lớp này lại phân cấp thành hai lớp con là cao cấp và bình dân, ta lại có nhu cầu là tạo các sản phẩm cao cấp ở một nhà máy loại 1, các sản phẩm bình dân ở một nhà máy loại 2. Lớp Client ở đây là lớp hàng mẫu, sẽ bao gồm một điện thoại mẫu và một máy tính mẫu. Cách tối ưu để tạo lập cho bài toán này là sử dụng mẫu Abstract Factory.
Ta có hình sau:


Code:...

IV. Đút kết kinh nghiệm
Khi gặp các bài toán có dạng sau ta nên dùng mẫu Abstract Factory trong việc tạo lập:
- Có nhiều hơn 2 sản phẩm, mỗi sản phẩm lại phân làm các loại sản phẩm con 1, 2,..
- Có nhu cầu sản xuất riêng các sản phẩm con loại 1 với các sản phẩm con loại 2.
Giải pháp :
- Tạo nhà máy thỏa mãn nhu cầu chỉ sản xuất riêng các sản phẩm con loại 1.
- Tạo nhà máy thỏa mãn nhu cầu chỉ sản xuất riêng các sản phẩm con loại 2.
- Tạo một nhà máy tổng quát làm lớp cha cho hai loại nhà máy trên.
- Lớp Client sẽ dùng biến nhà máy tổng quát này để tạo lập.

V. Mẫu liên quan
Abstract Factory thường được cài đặt cùng với Singleton. Các lớp con cụ thể (concrete class, ở đây ví dụ là Nhà_Máy_Loại_1 và Nhà_Máy_Loại_2) thường được cài đặt bằng Singleton. Bởi Singleton có thể tạo ra những đối tượng đồng nhất cho dù chúng ta gọi nó ở đâu trong chương trình.



Nguồn: LMinh

Nhận xét

Bài đăng phổ biến từ blog này

Property trong Objective-C

Quản lý bộ nhớ trong Objective-C

Optional trong Swift