Builder Design Pattern trong C# - Cách triển khai và ví dụ
Trong bài viết này mình sẽ giới thiệu cho các bạn về Builder Design Pattern trong C# - cách triển khai và ví dụ. Đây là một loại pattern thuộc nhóm Creational Design Pattern.
Chúng ta sẽ tìm hiểu Builder Design Pattern là gì? Cách triển khai nó như thế nào trong C# và một vài ví dụ thực tế về nó.
Builder Design Pattern trong C# là gì?
Builder Design Pattern xây dựng một đối tượng phức tạp bằng cách sử dụng nhiều đối tượng đơn giản và sử dụng phương pháp tiếp cận từng bước.
Nếu quá trình xây dựng của chúng ta quá phức tạp, thì hãy sử dụng Builder Design Pattern.
Bài viết này được đăng tại [free tuts .net]
Để hiểu rõ hơn, các bạn hãy cùng mình xem qua ví dụ dưới đây.
Ví dụ 1:
Giả sử chúng ta có một chiếc Laptop, đây là một vật thể phức tạp. Để xây dựng một chiếc laptop, ta cần sử dụng nhiều vật thể nhỏ như: màn hình, ổ cứng, pin, ... .
Vì vậy, nếu sử dụng quá trình trên thì ta có thể tạo ra nhiều chiếc laptop khác nhau với các thiết bị khác nhau. Nhưng vẫn tuân thủ theo cấu trúc của một chiếc máy tính. Chẳng hạn như chiếc laptop này thì có Ram 4gb, chiếc kia có Ram 8gb.
Ví dụ 2:
Giả sử mình cần thiết kế một bài báo cáo tốt nghiệp với hai dạng Word và Power Point. Cả hai bài này đều có cấu trúc từng phần như nhau: Lý do chọn đề tài, phương pháp nghiên cứu, chức năng, ... .
Như vậy ta tách ra làm từng phần nhỏ, sau đó trình bày ở hai dạng báo cáo khác nhau là Word và Power Point mà nội dung vẫn như nhau.
Sơ đồ Builder Design Pattern trong C#
Để tách quá trình xây dựng, Builder Design Pattern xây dựng bao gồm 4 thành phần như sau:
Giải thích sơ đồ:
- Builder: Là một giao diện xác định tất cả các bước được sử dụng để tạo ra một sản phẩm.
- Concrete: Class ConcreteBuilder triển khai giao diện Builder. Chịu trách nhiệm xây dựng và lắp ráp các bộ phận riêng lẻ của sản phẩm.
- Director: Class Director lấy các quy trình riêng lẻ đó từ Builder và xác định trình từ để xây dựng sản phẩm.
- Product: Class này xác định các bộ phận khác nhau sẽ tạo ra sản phẩm.
Cách triển khai Builder Design Pattern trong C# và ví dụ
Trong phần này mình sẽ triển khai Builder Design Pattern trong C# thông qua một ví dụ, cụ thể như sau.
Chúng ta sẽ tạo ra một bản báo cáo với 3 phần nội dung: ReportHeader, ContentReport và ReportFooter. Bản báo cáo sẽ được trình bày dưới hai dạng là Excel và PDF.
Người dùng nhập vào tên dạng báo cáo là gì, thì chương trình sẽ hiển thị ra nội dung của từng phần có trong báo cáo đó. Bây giờ hãy cùng mình thực hiện thôi nào !!!
Bước 1: Tạo class Report bao gồm ReportType, ReportHeader, ContentReport và ReportFooter.
using System; using System.Collections.Generic; using System.Text; namespace BuilderDesignPattern { public class Report { public string ReportType { get; set; } public string ReportHeader { get; set; } public string ReportFooter { get; set; } public string ReportContent { get; set; } public void DisplayReport() { Console.WriteLine("Report Type :" + ReportType); Console.WriteLine("Header :" + ReportHeader); Console.WriteLine("Content :" + ReportContent); Console.WriteLine("Footer :" + ReportFooter); } } }
Bước 2: Tạo class ReportBuilder
using System; using System.Collections.Generic; using System.Text; namespace BuilderDesignPattern { public abstract class ReportBuilder { protected Report reportObject; public abstract void SetReportType(); public abstract void SetReportHeader(); public abstract void SetReportContent(); public abstract void SetReportFooter(); public void CreateNewReport() { reportObject = new Report(); } public Report GetReport() { return reportObject; } } }
Bước 3: Bởi vì chúng ta đang xử lý hai dạng báo cáo là Excel và PDF vậy nên cần tạo hai class ExcelReport và PDFReport.
using System; using System.Collections.Generic; using System.Text; namespace BuilderDesignPattern { class ExcelReport : ReportBuilder { public override void SetReportContent() { reportObject.ReportContent = "Excel Content Section"; } public override void SetReportFooter() { reportObject.ReportFooter = "Excel Footer"; } public override void SetReportHeader() { reportObject.ReportHeader = "Excel Header"; } public override void SetReportType() { reportObject.ReportType = "Excel"; } } }
using System; using System.Collections.Generic; using System.Text; namespace BuilderDesignPattern { public class PDFReport : ReportBuilder { public override void SetReportContent() { reportObject.ReportContent = "PDF Content Section"; } public override void SetReportFooter() { reportObject.ReportFooter = "PDF Footer"; } public override void SetReportHeader() { reportObject.ReportHeader = "PDF Header"; } public override void SetReportType() { reportObject.ReportType = "PDF"; } } }
Bước 4: Tạo class ReportDirector có một phương thức chung là MakeReport() có tham số đầu vào là ReportBuilder. Sau đó tạo và trả về một báo cáo cụ thể.
using System; using System.Collections.Generic; using System.Text; namespace BuilderDesignPattern { public class ReportDirector { public Report MakeReport(ReportBuilder reportBuilder) { reportBuilder.CreateNewReport(); reportBuilder.SetReportType(); reportBuilder.SetReportHeader(); reportBuilder.SetReportContent(); reportBuilder.SetReportFooter(); return reportBuilder.GetReport(); } } }
Bước 5: Tạo class Client để chạy chương trình và kiểm tra kết quả.
using System; namespace BuilderDesignPattern { class Program { static void Main(string[] args) { Report report; ReportDirector reportDirector = new ReportDirector(); PDFReport pdfReport = new PDFReport(); report = reportDirector.MakeReport(pdfReport); report.DisplayReport(); Console.WriteLine("-------------------"); ExcelReport excelReport = new ExcelReport(); report = reportDirector.MakeReport(excelReport); report.DisplayReport(); Console.WriteLine("\n----------------------------------\n"); Console.Write("Chuong trinh nay duoc dang tai Freetuts.net"); Console.ReadKey(); } } }
Kết quả:
Như vậy là chúng ta đã tìm hiểu xong về Builder Design Pattern trong C# - Cách triển khai và ví dụ của nó. Ở bài tiếp theo mình tiếp tục giới thiệu các bạn về Prototype Design Pattern trong C#.