Bạn đang xem: Builder là gì
Hãy tưởng tượng một đối tượng người tiêu dùng phức tạp đòi hỏi nhiều công sức, khởi sinh sản từng bước của tương đối nhiều trường và các đối tượng người dùng lồng nhau.Code khởi tạo vậy nên thường được chôn phía bên trong một hàm constructor vĩ đại với tương đối nhiều tham số. Hoặc thậm chí còn tệ hơn: ở rải rác rến trên toàn bộ client code.
Ví dụ: hãy nghĩ về kiểu cách tạo object House. Để phát hành một ngôi nhà đơn giản, bạn cần xây dựng bốn bức tường cùng nền nhà, lắp cửa ngõ ra vào, lắp một cặp cửa sổ và xây đắp một mái nhà.Nhưng nếu bạn có nhu cầu một ngôi nhà phệ hơn, tự tin hơn, có sân sau và những tiện ích không giống (như khối hệ thống sưởi, hệ thống ống nước và hệ thống dây điện)?
Giải pháp đơn giản dễ dàng nhất là không ngừng mở rộng lớp House và chế tác một tập hợp các lớp nhỏ để bao gồm tất cả các tổ hợp của những tham số.Nhưng cuối cùng bạn sẽ có một trong những lượng đáng kể những lớp con. Bất kỳ thông số mới nào, chẳng hạn như kiểu hiên nhà, vẫn yêu mong phát triển khối hệ thống phân cung cấp này nhiều hơn nữa.
Có một cách tiếp cận không giống không tương quan đến bài toán lai tạo các lớp con. Chúng ta có thể tạo một cách làm constructor mập mạp ngay trong lớp House với toàn bộ các tham số hoàn toàn có thể điều khiển object house. Tuy vậy cách tiếp cận này thực sự loại bỏ sự cần thiết của các lớp con, cơ mà nó lại tạo thành một vụ việc khác.
Trong hầu như các trường hợp, hầu như các tham số sẽ không còn được sử dụng, làm cho những lần gọi constructor hơi rắc rối. Ví dụ, chỉ 1 phần nhỏ những ngôi nhà bao gồm bể bơi, bởi vì vậy các thông số kỹ thuật liên quan đến hồ bơi sẽ vô dụng với những trường vừa lòng khác.
SolutionVì vậy Builder Pattern gợi ý rằng các bạn trích xuất object construction code thoát khỏi lớp của chính nó và dịch rời nó đến các object riêng biệt được gọi là Builder.
Pattern bố trí việc tạo ra object thành một tập hợp công việc (buildWalls, buildDoor, v.v.). Để chế tạo ra một object, bạn triển khai một loạt quá trình này bên trên một builder object. Phần đặc trưng là bạn không cần phải gọi toàn bộ các bước. Các bạn chỉ có thể gọi hầu như bước cần thiết để tạo thành một thông số kỹ thuật cụ thể của một object.
Một số bước construction rất có thể yêu mong thực hiện khác nhau khi bạn cần xây dựng những thể hiện đại diện thay mặt khác nhau của sản phẩm (build various representations of the product).Ví dụ, những bức tường của một cabin hoàn toàn có thể được xây dựng bằng gỗ, nhưng các bức tường của thành tháp phải được xây dựng bởi đá.
Trong trường vừa lòng này, chúng ta có thể tạo một số class builder khác biệt triển khai và một tập hợp quá trình xây dựng, dẫu vậy theo một giải pháp khác.Sau đó, chúng ta có thể sử dụng các builder này trong quá trình xây dựng (tức là một tập hợp các lệnh gọi có thứ từ đến các bước xây dựng) để tạo nên các loại object khác nhau.
Ví dụ, hãy tưởng tượng một bạn thợ xây dựng hồ hết thứ từ bỏ gỗ và kính, tín đồ thứ hai xây dựng hồ hết thứ bằng đá điêu khắc và sắt và bạn thứ ba sử dụng vàng và kim cương.
Bằng bí quyết gọi cùng một đội nhóm các bước, các bạn sẽ có được một ngôi nhà thông thường từ fan xây dựng đầu tiên, một lâu đài nhỏ tuổi từ bạn thứ hai với một hoàng cung từ bạn thứ ba.
Tuy nhiên, vấn đề này sẽ chỉ vận động nếu client code gọi công việc xây dựng có thể tương tác với các builder bằng giao diện chung.
DirectorBạn có thể đi xa hơn với trích xuất hàng loạt lệnh hotline đến công việc của builder mà lại bạn thực hiện để xây đắp một thành phầm thành một lớp đơn nhất có tên là director.
Lớp Director xác định thứ từ thực hiện công việc xây dựng, trong khi trình xây dựng cung ứng việc triển khai cho công việc đó.
Xem thêm: Cách Tăng Dòng Từ Đồ Xanh Thành Đồ Tím Võ Lâm 1 Miễn Phí Cho Các Game Thủ
Việc có một lớp director vào chương trình của chúng ta là không hoàn toàn cần thiết. Các bạn luôn rất có thể gọi công việc xây dựng theo vật dụng tự ví dụ trực tiếp tự client code.Tuy nhiên, lớp director rất có thể là một chỗ tốt để đưa các tiến trình xây dựng không giống nhau để chúng ta có thể sử dụng lại chúng trong lịch trình của mình.
Ngoài ra, lớp director hoàn toàn ẩn các product construction với client code. Client chỉ cần liên kết builder cùng với director, khởi chạy construction với director và nhận tác dụng từ builder.
Các thành phần nằm trong mô hình:
Builder: giao diện Builder khai báo công việc product construction thông thường cho toàn bộ các loại builder. Abstract interface để khiến cho các đối tượng người dùng sản phẩm ( object hàng hóa )Concrete Builder: hỗ trợ các bí quyết triển khai khác biệt của các bước construction mang đến Builder. Các concrete builder hoàn toàn có thể tạo ra các product ko tuân theo giao diện chung.ConcreBuilder: là 1 object có thể xây dựng nên những object khác. Thành lập và gắn thêm ráp các phần để desgin object.Products: là các đối tượng người tiêu dùng kết quả. Các product do các builder không giống nhau tạo ra không độc nhất vô nhị thiết đề nghị thuộc thuộc một hệ thống phân cấp hoặc đồ họa lớp.Director: Lớp Director khẳng định thứ tự gọi công việc construction, bởi vậy chúng ta có thể tạo và áp dụng lại các thông số kỹ thuật cụ thể của product.Client: Client buộc phải liên kết một trong các đối tượng trình tạo với director. Thông thường, nó chỉ được triển khai một lần, thông qua các thông số của hàm chế tạo của director. Sau đó, director sử dụng builder object kia cho toàn bộ các construction tiếp theo.Tuy nhiên, gồm một giải pháp tiếp cận thay thế sửa chữa khi client gửi builder object thanh lịch production method của director. Trong trường vừa lòng này, bạn cũng có thể sử dụng một builder khác mỗi khi chúng ta sản xuất câu chữ nào kia với director.
Ví dụ: Class Director ko trực tiếp tạo thành vào thêm ráp thành product là oto và Manual. Ráng vào kia class Director chí cho Builder Interface để tạo cho các thành phần của một complex object, tạo nên Director hòa bình với các lớp ví dụ nào được khởi sinh sản (biểu diễn làm sao được sinh sản ra).
Lớp CarBuilder tiến hành giao diện Builder bằng cách tạo với lắp ráp các đối tượng người sử dụng Car và giống như lớp CarManualBuilder xúc tiến giao diện Builder bằng ac1ch chế tạo ra và gắn ráp các đối tượng người sử dụng Manual.
Builder được sử dụng khi:
Sử dụng mẫu Builder để tránh sử dụng “telescopic constructor” ( hotline là telescopic constructor là vì lúc một class có rất nhiều constructor với tương đối nhiều parameter vào constructor sẽ gây nên khó khăn cho người lập trình nhằm nhớ và áp dụng cái nào đến đúng ). Builder Pattern chất nhận được bạn xây dựng các object từng bước, chỉ áp dụng những bước bạn thực sự cần. Sau thời điểm triển khai pattern, bạn chưa phải nhồi nhét sản phẩm tá tham số vào những constructor của bản thân nữa.Sử dụng Builder Pattern khi bạn có nhu cầu code của mình hoàn toàn có thể tạo những cách thể hiện khác nhau của một số sản phẩm (ví dụ: nhà bằng đá điêu khắc và bằng gỗ). Builder Pattern có thể được áp dụng khi bài toán xây dựng các phiên bản trình bày không giống nhau của sản phẩm bao gồm các bước giống như chỉ khác biệt về bỏ ra tiết.Sử dụng Builder để tạo thành cây Composite hoặc các đối tượng người sử dụng phức tạp khác. Builder Pattern chất nhận được bạn tạo sản phẩm theo từng bước. Bạn có thể trì hoãn bài toán thực hiện một số trong những bước mà không làm cho hỏng sản phẩm cuối cùng. Bạn thậm chí rất có thể gọi đệ quy những bước, điều đó rất hữu ích khi bạn cần kiến thiết một cây đối tượng. Một Builder không để lộ sản phẩm chưa hoàn thành khi đã chạy quá trình xây dựng. Điều này ngăn quán triệt client code tìm nạp tác dụng không đầy đủ.//Builder Interface: chỉ định những phương phương thức để tạo các phần khác biệt Product object public interface IBuilder void BuildPartA(); void BuildPartB(); void BuildPartC(); //Concrete Builder: theo đúng Builder Interface cung ứng các triển khai rõ ràng của mỗi bước public class ConcreteBuilder : IBuilder private product _product = new Product(); public ConcreteBuilder() this.Reset(); public void Reset() this._product = new Product(); public void BuildPartA() this._product.Add("PartA1"); public void BuildPartB() this._product.Add("PartB1"); public void BuildPartC() this._product.Add("PartC1"); public product GetProduct() product result = this._product; this.Reset(); return result; //Product: Chỉ áp dụng Builder Pattern lúc sản phẩm có tương đối nhiều loại với trở nên tinh vi và cần có tỉnh mở rộng. //Vì đôi khi Concrete builder không giống nhau rất có thể tạo ra hầu như product không giống nhau và không tương quan đến nhau. Public class hàng hóa { private danh mục _parts = new List(); public void Add(string part) this._parts.Add(part); public string ListParts() { string str = string.Empty; for (int i = 0; i