Design Patterns: Factory Method

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Thuộc nhóm: Creational

Tần suất sử dụng: Cao trung bình

Vấn đề đặt ra

Các Framework thường sử dụng các lớp trừu tượng để định nghĩa và duy trì mối quan hệ giữa các đối tượng.Một framework thường đảm nhiệm việc tạo ra các đối  tượng hoàn chỉnh. Việc xây dựng một framework cho ứng dụng mà có thể đại diện cho nhiều đối tượng tài liệu cho người dùng. Có 2 loại lớp trừu tượng chủ chốt trong framework này là lớp ứng dụng và tài liệu.Cả 2 lớp đều là lớp trừu tượng, và trình  khách phải xây dựng các dẫn xuất, các lớp con để hiện thực hoá, tạo ra đối tượng phù hợp với yêu cầu của ứng dụng. Chẳng hạn để tạo ra một ứng dụng drawing, chúng ta định nghĩa một lớp DrawingApplication và một lớp DrawingDocument. Lớp ứng  dụng chịu trách nhiệm quản lý tài liệu và chúng ta sẽ tạo ra chúng khi có nhu cầu ( chẳng hạn khi người dùng chọn Open hoặc New từ menu).

Bởi vì một lớp Document cá biệt như thế này được tạo ra từ các dẫn xuất  của  lớp Abstract Document (trong framework) để đưa ra các thể nghiệm cho một ứng dụng Drawing, lớp ứng dụng không thể biết trước được lớp dẫn xuất của Abstract Document nào sẽ được tạo ra để trình bày, mà nó chỉ biết khi nào một đối tượng tài liệu nào nên được tạo chứ không biết loại đối tượng tài liệu nào để tạo. Điều này tạo ra một sự tiến thoái lưỡng nan: framework phải thể nghiệm một lớp, nhưng nó chỉ biết về lớp trừu tượng của nó, mà lớp trừu tượng này lại không thể thể nghiệm trực tiếp được.Nếu ai từng làm việc với giao diện ứng dụng đơn tài liệu và đa tài liệu trong ngôn ngữ Visual C++, chúng ta cũng sẽ bắt gặp một vấn đề tương tự. Đối tượng MainFrame có thể tạo ra một dối tượng view mỗi khi người dùng nhấn chuột vào menu View hay Open, nhưng MainFrame hoàn toàn không hề biết một chút thông tin nào trước đó về View vì nó không chứa bất cứ một thể nghiệm nào của View.

Mẫu Abstract Method đưa ra một giải pháp cho vấn đề này.Nó đóng gói thông  tin về lớp dẫn xuất Document nào được tạo và đưa ra ngoài framework.

Lớp dẫn xuất ứng dụng định nghĩa lại một phương thức trừu tượng CreateDocument() trên lớp Application để trả về một đối tượng thuộc lớp dẫn xuất của lớp document.

class Application

{

//Các khai báo khác Public:

Document* CreateDocument();

//Các khai báo khác

};

Document* Application::CreateDocument()

{

Document* newDocument = new MyDocument(); Return newDocument;

}

Khi một đối tượng thuộc lớp dẫn xuất của Application được tạo ra, nó có thể  tạo

ra luôn các đối tượng tài liệu đặc biệt cho ứng dụng mà không cần biết về các lớp đó.Chúng ta gọi CreateDocument là một factory method bởi vì nhiệm vụ của nó là sản xuất ra các đối tượng.

Định nghĩa Factory Method

Factory Method là một giao diện cho việc tạo ra một đối tượng, nhưng để cho  lớp dẫn xuất quyết định lớp nào sẽ được tạo.Factory method để cho một lớp trì hoãn sự thể nghiệm một lớp con.

Sơ đồ UML

design-patterns-luoc-do-uml-factory-method.png

Product (Page)

  • Định nghĩa giao diện của các đối tượng mà Factory Method tạo ra.

ConcreteProduct  (SkillsPage, EducationPage, ExperiencePage)

  • Cài đặt giao diện Product.

Creator (Document)

  • Khai báo Factory Method mà trả về một đối tượng của kiểu Product. Sự kiến tạo này cũng có thể định nghĩa một cài đặt mặc định của Factory  Method trả về một đối tượng ConcreteProduct mặc định.
  • Có thể gọi Factory Method để tạo ra một đối tượng Product.

ConcreteCreator  (Report, Resume)

  • Chồng lên Factory Method để trả về một thể nghiệm của một ConcreteProduct.

Mẫu liên quan

Abstract Factory thường được cài đặt cùng với Factory Method. Lớp Factory Method thường được gọi là Template Method. Trong ví dụ về ứng dụng Drawing trên,NewDocument là một template method.

Prototype không cần đến một lớp con Creator, tuy nhiên thường đòi hỏi một phương thức để tạo thể nghiệm trên lớp dẫn xuất.

» Tiếp: Prototype
« Trước: Builder
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!