Factory Pattern – Hãy chuẩn bị “tiếp đón” một vài ba xây cất OO “phối hợp lỏng lẻo”

Có các máy nhằm tạo thành đối tượng người dùng chũm vị sử dụng toán tử new. Với Factory Pattern bạn sẽ học tập được rằng khởi sản xuất là 1 trong chuyển động chưa phải dịp làm sao cũng rất được thực hiện công khai minh bạch, với điều đó thường xuyên dẫn mang lại những vụ việc về việc dựa vào. Và bạn không muốn điều này, đề xuất không? Tìm gọi làm nạm làm sao Factory Pattern hoàn toàn có thể cứu bạn ngoài sự phụ thuộc giữa các lớp.

Bạn đang xem: Abstract factory pattern là gì


*

Khi các bạn thấy tự khóa “new”, hãy nghĩ về những lớp nhỏ.

Vâng, khi chúng ta áp dụng new, các bạn chắc chắn là vẫn tạo ra một object của lớp bé, cho nên vì thế, chắc chắn là một “programing khổng lồ implement” (Khái niệm này được đề cập sống Chương thơm 1), không phải là “programing khổng lồ interface” . Và nó là 1 trong câu hỏi hay; bạn đang học được rằng vấn đề đính thêm code của doanh nghiệp vào một trong những lớp thấp cấp có thể dễ vỡ vạc cùng kém nhẹm linch hoạt hơn.


*

*

Ở đây, công ty chúng tôi sẽ tất cả một vài lớp cụ thể được khởi chế tạo ra cùng ra quyết định khởi tạo nên đưa ra trong thời hạn chạy (runtime) tùy ở trong vào một vài ĐK.

lúc chúng ta thấy code gắng này, bạn biết rằng lúc tới dịp đề xuất biến đổi hoặc mở rộng, các bạn sẽ phải mở lại code này với bình chọn đều gì đề xuất thêm (hoặc xóa). thường thì nhiều loại code cố này chấm dứt vào một vài phần của áp dụng khiến cho Việc duy trì với update trngơi nghỉ đề xuất khó khăn rộng với dễ bị lỗi hơn.

Nhưng bạn phải lập một đối tượng cùng Java chỉ cung ứng mang đến chúng ta một cách duy nhất để sản xuất một đối tượng (new), cần không? Vì vậy, ta đã làm cho gì? Có điều gì không đúng Lúc áp dụng “new”?

Về phương diện nghệ thuật, không tồn tại gì không nên với new cả, nó là 1 phần cơ bạn dạng của Java. Thủ phạm thực thụ là người chúng ta cũ của chúng ta – SỰ THAY ĐỔI, cùng SỰ THAY ĐỔI tác động tới việc sử dụng new của chúng ta.

Bằng bí quyết “code với cùng 1 interface” (programing lớn interface), chúng ta biết rằng bạn cũng có thể từ bỏ bảo đảm bản thân khỏi không hề ít biến hóa có thể xảy ra với cùng một khối hệ thống. Tại sao? Nếu code của bạn được dựa trên một interface, thì nó đã hoạt động cùng với bất kỳ lớp bắt đầu làm sao implement interface đó thông qua nhiều hình. Tuy nhiên, khi chúng ta bao gồm code dựa trên lớp con, bạn sẽ gặp mặt rắc rối bởi code kia rất có thể buộc phải chuyển đổi Khi những lớp bé bắt đầu được sản xuất. Vì vậy, có thể nói, lớp của các bạn sẽ không trở nên “đóng góp cho vấn đề sửa đổi” (vi phạm luật hiệ tượng vẫn nhắc ở Chương thơm 3: Decorator Pattern – Đối tượng trang trí). Để hoàn toàn có thể không ngừng mở rộng nó cùng với những loại lớp con mới, các bạn sẽ sẽ phải “mở” lại nó.

Vậy bạn cũng có thể làm cho gì? Đây là lúc bạn cũng có thể phụ thuộc Nguyên tắc xây cất OO nhằm tìm kiếm tìm dắt mối. Hãy hãy nhớ là, hiệ tượng trước tiên của họ (Strategy) tương quan đến việc thay đổi cùng lí giải họ xác định những tinh tế khác nhau với bóc tách bọn chúng ngoài đa số gì vẫn giữ nguyên.

Sử dụng sức mạnh bộ não

Làm cầm nào chúng ta cũng có thể mang tất cả những đoạn code “khởi sản xuất lớp con” vào áp dụng của khách hàng cùng tách hoặc đóng gói bọn chúng ngoài đông đảo phần còn lại?

Xác định những chu đáo không giống nhau

Hãy nói rằng bạn bao gồm một siêu thị pizza với là nhà shop pizza tiên tiến và phát triển làm việc Objectville, chúng ta cũng có thể vẫn viết một vài loại code như thế này:


*

Nhưng bạn cần những nhiều loại pizza hơn…

Vì vậy, tiếp đến chúng ta thêm một vài cái code tư tưởng loại pizza cân xứng và kế tiếp khởi tạo bánh pizza:


*

Nhưng yêu cầu thêm nhiều các loại pizza nữa

Quý khách hàng nhận biết rằng toàn bộ những kẻ thù đối đầu của khách hàng sẽ thêm một vài một số loại pizza “đúng theo thời trang” vào thực đối kháng của họ: Pizza Clam với Veggie Pizza. Rõ ràng bạn cần theo kịp kẻ thù, bởi vậy các bạn sẽ thêm những mục này vào thực solo của bản thân. Và vừa mới đây các bạn ko cung cấp được nhiều bánh Greek Pizzas, vày vậy các bạn quyết định các loại bỏ nó ra khỏi thực đơn:


Rõ ràng, bài toán cách xử trí khởi tạo bên trên thực thụ gây phá mang đến thủ tục orderPizza() của chúng ta cùng ngăn cấm đoán nó “đóng mang lại bài toán sửa đổi”. Nhưng hiện nay họ đã biết vật gì đang biến hóa cùng cái gì ko, chắc hẳn rằng đã tới lúc đóng gói nó.

Đóng gói việc khởi sản xuất đối tượng

Vì vậy, hiện thời họ hiểu được đã tốt hơn lúc chuyển Việc tạo đối tượng người sử dụng thoát ra khỏi cách tiến hành orderPizza(). Nhưng bằng cách nào? Chà, mọi gì Cửa Hàng chúng tôi vẫn làm là mang phần code chế tạo ra pizza và đưa nó ra một đối tượng người tiêu dùng không giống chỉ liên quan tới sự việc tạo thành pizza.


Chúng tôi đã khắc tên mang đến đối tượng người sử dụng mới này: Cửa Hàng chúng tôi Call nó là Factory.

Các nhà máy sản xuất Factory cách xử trí phần cụ thể của vấn đề chế tạo đối tượng người dùng. Khi chúng ta tất cả một SimplePizzaFactory, phương thức orderPizza() của họ sẽ trở thành một đồ vật khách (client) của đối tượng người dùng đó. Bất cứ đọng khi nào nó phải một chiếc bánh pizza, nó đã yên cầu nhà máy sản xuất cung ứng pizza có tác dụng một chiếc. Đã qua rồi chiếc thời nhưng mà cách làm orderPizza() cần biết về các loại pizza Greek Pizzas xuất xắc là Clam pizzas. Bây giờ đồng hồ thủ tục orderPizza() chỉ quan tâm rằng nó nhận thấy một dòng bánh pizza vẫn implement giao diện Pizza để nó có thể Gọi prepare(), bake(), cut(), với box().

Chúng tôi vẫn đang còn một vài cụ thể nhằm điền vào đây; ví dụ điển hình, cách tiến hành orderPizza() sửa chữa code chế tác của nó bởi gì? Hãy implement một nhà máy đơn giản dễ dàng cho siêu thị pizza và tìm hiểu …

Xây dựng một Pizza Factory đối chọi giản

Chúng tôi đã bắt đầu với thiết yếu nhà máy. Những gì công ty chúng tôi sẽ làm cho là khái niệm một tấm gói gọn gàng vấn đề tạo ra đối tượng người sử dụng cho tất cả những một số loại pizza. Nó đây…


Không tất cả câu hỏi làm sao ngớ ngẩn

Hỏi: Lợi ích của việc này là gì? Có vẻ như chúng ta chỉ sẽ đẩy vấn đề qua một đối tượng người tiêu dùng khác.

Trả lời: Một vấn đề cần nhớ rằng SimplePizzaFactory hoàn toàn có thể có không ít client. Chúng ta chỉ thấy phương thức orderPizza() Điện thoại tư vấn mang lại nó; mặc dù, có thể tất cả một tấm client không giống – PizzaShopMenu cũng thực hiện factory nhằm tạo ra pizza với mang mô tả với giácủa nó. Chúng ta cũng có thể gồm một tờ HomeDelivery hotline mang lại nhà máy tạo pizza theo cách khác cùng với lớp PizzaShop, tuy vậy tất cả bọn chúng đầy đủ là client của Factory.

Vì vậy, bằng phương pháp đặt câu hỏi khởi chế tạo ra pizza trong vô số nhiều lớp, bây giờ họ chỉ có một tờ nhằm triển khai sửa đổi Khi quan trọng. Đừng quên, bọn họ cũng sắp xóa việc khởi tạo thành lớp nhỏ khỏi cách tiến hành orderPizza() !

Hỏi: Tôi sẽ thấy một kiến thiết tựa như, trong số ấy một factory sẽ được khái niệm là 1 trong phương thức static. Có sự khác biệt gì không?

Trả lời: Định nghĩa factory là 1 trong cách tiến hành static là một trong những chuyên môn thông dụng và thường được hotline là 1 “static factory”. Tại sao áp dụng phương thức tĩnh ư? Bởi vì chưng chúng ta ko đề xuất khởi chế tạo ra một đối tượng người dùng để sử dụng cách làm factory. Nhưng hãy nhớ rằng nó cũng có sự ăn hại là bạn cần yếu có lớp nhỏ với biến hóa hành vi của cách tiến hành get, set.

Làm lại lớp PizzaStore với Simple Factory

Bây giờ đồng hồ là thời hạn để sửa code. Những gì chúng tôi muốn làm cho là dựa vào factory nhằm tạo nên những loại pizza. Dưới đây là mọi cầm cố đổi:

Bây giờ lớp PizzaStore (client) đã tsay mê chiếu mang đến SimplePizzaFactory (factory) của họ.


Sử dụng sức khỏe cỗ não

Chúng ta hiểu được câu hỏi phối hợp các object (composition) vậy vì implementation cho phép họ đổi khác hành động một giải pháp linc hoạt vào runtime cũng chính vì bọn chúng rất có thể chuyển đổi thân trong với quanh đó câu hỏi kế thừa. Làm cụ nào chúng ta cũng có thể sử dụng điều này trong PizzaStore? Những thực thi factory làm sao bạn cũng có thể thảo luận thân vào cùng ngoài?

Định nghĩa Simple Factory

Simple Factory ko đích thực là một trong chủng loại thiết kế; nó là 1 programming idiom (thành ngữ lập trình). Nhưng nó hay được sử dụng, vì chưng vậy công ty chúng tôi đang khuyến mãi mang đến nó một danh hiệu “Head First Pattern Honorable Mention”.


Một số bên phát triển sẽ nhầm với “Factory Pattern” (đầy đủ gì chúng ta mày mò nãy tiếng chưa hẳn là Factory Pattern), vì chưng vậy lần sau, Khi thân bạn cùng một developer không giống lần khần nói gì, bạn đã sở hữu một chủ thể hay nhằm bàn luận.

Simple Factory không hẳn là 1 trong những mẫu mã THỰC SỰ, không tức là chúng ta không nên cẩn thận bí quyết nhưng nó kết hợp với nhau. Hãy thuộc coi sơ vật lớp của Thương hiệu Pizza new của bọn chúng tôi:


Hãy nghĩ về Simple Factorgiống như một sự khởi cồn. Phía sau, chúng ta cũng sẽ tò mò Abstract Factory Pattern. Nhưng chớ lo, vẫn còn đó các điều để nói ngơi nghỉ đây!

* Chỉ là 1 lời nhắc khác: trong những chủng loại kiến thiết, các tự “implement an interface”, không hẳn dịp nào cũng Tức là “chế tác một lớp implement một Java interface, bằng cách áp dụng từ khóa “implements” vào khai báo lớp con”. Một lớp cụ thể implements một cách làm từ 1 supertype (có thể là 1 trong những lớp HOẶC interface) vẫn được xem là một “implement an interface” của supertype đó.

Nhượng quyền siêu thị pizza

(Nhượng quyền thương hiệu đọc nôm mãng cầu là chất nhận được sử dụng chữ tín của công ty để mtại 1 chi nhánh không giống, và chia lại ROI cho bạn. Royal tea – Tkiểm tra sữa ngơi nghỉ toàn bộ những vị trí không phải cùng 1 người tải, đó đã được nhượng quyền lại cho những người khác)

Objectville PizzaStore của doanh nghiệp đã làm tốt nhất mang lại nỗi các bạn vẫn thừa qua kẻ địch cùng bây chừ rất nhiều fan phần đa mong mỏi gồm một PizzaStore ngơi nghỉ nơi họ sống. Là fan nhượng quyền (franchiser), bạn muốn bảo đảm chất lượng của hoạt động nhượng quyền với bởi vậy bạn có nhu cầu chúng ta thực hiện lại code (mà lại chúng ta chúng ta sẽ bỏ thời hạn ra test) nhằm các siêu thị được nhượng quyền sử dụng.

Nhưng bao gồm sự biệt lập về khu vực? Mỗi vị trí được nhượng quyền rất có thể muốn cung ứng những một số loại pizza không giống nhau (Thủ đô New York, Chicago và California,…), tùy nằm trong vào vị trí shop được nhượng quyền cùng nhu cầu của rất nhiều fan sành pizza nghỉ ngơi địa pmùi hương.


Chúng tôi đã thấy một bí quyết tiếp cận …

Nếu Cửa Hàng chúng tôi đào thải lớp SimplePizzaFactory và tạo thành ba lớp factory khác: NYPizzaFactory, ChicagoPizzaFactory với CaliforniaPizzaFactory, thì công ty chúng tôi rất có thể phối hợp PizzaStore với một factory cân xứng với nhượng quyền thương thơm mại là điều xuất sắc. Đó là 1 trong những giải pháp tiếp cận.

Hãy coi điều này đang trông như …


Nhưng bạn muốn kiểm soát điều hành unique rộng một ít …

Vì vậy, các bạn đã từng nghiệm SimpleFactory cho những cửa hàng được nhượng quyền với mọi gì các bạn thấy là các shop đó đã áp dụng SimpleFactory để tạo thành pizza, nhưng sống địa phương của họ, phương pháp tạo nên bánh pizza sẽ sở hữu được một vài ba không giống biệt: bọn họ nướng hồ hết đồ vật tương đối khác một ít, chúng ta yêu cầu cắt bánh pizza ra trước khi giao cùng họ vẫn thực hiện vỏ hộp của mặt trang bị ba…


Xem xét lại vấn đề một chút ít, bạn thấy rằng các gì bạn thực thụ mong muốn làm cho là tạo nên một khuôn khổ kết nối cửa hàng với việc tạo thành pizza với nhau, dẫu vậy vẫn chất nhận được hồ hết thiết bị vẫn linh hoạt. (Với SimpleFactory thì ví dụ nhiều người đang bắt buộc những cửa hàng nhượng quyền đề xuất theo một khuôn khổ duy nhất)

Trong code trước đây của chúng tôi, trước SimplePizzaFactory, chúng tôi đã gồm code làm cho bánh pizza nối sát cùng với PizzaStore, nhưng mà nó ko linh hoạt. Vì vậy, làm cho ráng nào bạn cũng có thể bao gồm bánh pizza của bọn chúng tôi?

Một Framework mang lại cửa hàng pizza

Có một cách để “bản địa hóa” tất cả những vận động làm cho bánh pizza cho lớp PizzaStore, tuy thế vẫn có thể chấp nhận được nhượng quyền tự do thoải mái theo style của từng khoanh vùng riêng rẽ.

Những gì Shop chúng tôi đang có tác dụng là đưa cách làm createPizza() quay trở về vào PizzaStore, tuy thế lần này là một trong những cách thức trừu tượng (abstract), sau đó chế tạo một tấm nhỏ PizzaStore cho từng hình trạng vùng.

Đầu tiên, hãy xem những đổi khác của PizzaStore:


Bây giờ đồng hồ Shop chúng tôi sẽ có một shop đã đợi những lớp con kế thừa; Cửa Hàng chúng tôi sẽ sở hữu được những lớp con đến từng các loại khu vực (NYPizzaStore, ChicagoPizzaStore, CaliforniaPizzaStore) và từng lớp con đang giới thiệu quyết định về phần lớn gì khiến cho một loại bánh pizza. Hãy coi vấn đề này vẫn vận động ra sao.

Cho phxay lớp con quyết định

Hãy hãy nhớ là, PizzaStore sẽ có một hệ thống đặt đơn hàng được thử nghiệm góc cạnh vào cách làm orderPizza() với bạn có nhu cầu bảo đảm rằng nó tương xứng cùng với tất cả các chỗ được nhượng quyền.

Điều biệt lập giữa những PizzaStores ở từng địa phương là phong cách pizza họ làm – Pizza New York bao gồm lớp vỏ mỏng dính, Chicago Pizza dày, v.v. – với Cửa Hàng chúng tôi đang gửi toàn bộ những biến thể này vào cách thức createPizza() với nó sẽ Chịu trách nát nhiệm tạo thành đúng nhiều loại pizza. Chúng ta có tác dụng điều này là bằng phương pháp chất nhận được từng lớp bé của PizzaStore quan niệm lại cách tiến hành createPizza(). Vì vậy, họ sẽ sở hữu một số lớp nhỏ cụ thể của PizzaStore, từng lớp có các đổi thay thể pizza riêng, tất cả phần lớn phía bên trong size PizzaStore cùng vẫn sử dụng phương thức orderPizza().

Xem thêm: Cameo Là Gì - Nhân Tố Tạo Sức Hot Cho Một Tác Phẩm Nghệ Thuật


Chà, hãy nghĩ về về nó theo ý kiến của phương thức orderPizza() của lớp PizzaStore: nó được có mang vào lớp trừu tượng PizzaStore, tuy thế những loại rõ ràng chỉ được tạo thành trong các lớp bé.


Bây tiếng, nhằm phát âm thêm một chút, thủ tục orderPizza() thực hiện không ít thứ với cùng một đối tượng người tiêu dùng Pizza (nhỏng sẵn sàng, nướng, giảm, đóng góp hộp), tuy vậy bởi vì Pizza là abstract, orderPizza() trù trừ lớp con đích thực là gì, có liên quan ra sao. Nói giải pháp khác, nó sẽ tách bóc ra!


Lúc orderPizza() Gọi createdPizza(), một trong các lớp bé của các bạn sẽ được Call hành động để tạo thành một chiếc bánh pizza. Những nhiều loại pizza làm sao sẽ tiến hành làm? Chà, điều ấy đưa ra quyết định do sự gạn lọc cửa hàng pizza mà bạn mua từ NYStylePizzaStore hoặc ChicagoStylePizzaStore.

Vì vậy, tất cả một quyết định mà những lớp con chỉ dẫn vào thời gian thực (runtime) đúng không? Không, dẫu vậy theo cách nhìn của orderPizza(), nếu như khách hàng lựa chọn NYStylePizzaStore, lớp bé đó sẽ khẳng định nhiều loại pizza nào được làm. Vì vậy, các lớp bé không phải là fan quyết định thực sự – mà đó là chúng ta, các bạn quyết định bằng cách chọn siêu thị làm sao bạn có nhu cầu – tuy vậy lớp con lại xác minh loại pizza nào được gia công.

Hãy sinh sản một PizzaStore

Là một khu vực được nhượng quyền đang bổ ích ích của chính nó. Quý khách hàng nhận ra toàn bộ các công dụng của lớp PizzaStore miễn giá tiền. Tất cả những siêu thị địa phương thơm bắt buộc làm là phân lớp PizzaStore cùng cung cấp phương thức createPizza() chế tạo ra các một số loại Pizza của mình. Chúng ta đã quyên tâm cha phong thái pizza to cho tất cả những người được nhượng quyền.

Tại trên đây, phong thái khu vực New York:


Lưu ý rằng cách thức orderPizza() trong lớp thân phụ băn khoăn nhiều loại Pizza nào họ sẽ tạo; Nó chỉ biết nó rất có thể sẵn sàng, nướng, cắt, và đóng hộp!

Một khi bọn họ sẽ xây cất những lớp bé PizzaStore, đã đến khi coi về vấn đề đặt cài một hoặc hai chiếc bánh pizza. Nhưng trước lúc họ làm điều đó, vì sao bạn không từ gây ra các siêu thị pizza Chicago StyleCalifornia Style? Lấy giấy ra và làm cho đi nhé.

Mô tả một phương thức factory

Chỉ với cùng 1 vài đổi khác cho PizzaStore, chúng tôi vẫn chuyển từ việc chỉ gồm một đối tượng người dùng giải pháp xử lý bài toán khởi tạo những lớp rõ ràng của Cửa Hàng chúng tôi thành một tập phù hợp những lớp con hiện tại đang đảm nhận trách nát nhiệm kia. Hãy nhằm lưu ý kỹ hơn:


Vậy làm nỗ lực như thế nào nhằm chúng ta đặt hàng?

trước hết, Joel và Ethan buộc phải một mô tả (instance) của PizzaStore. Joel thì nên khởi tạo một ChicagoPizzaStore và Ethan nên một NYPizzaStore.Với một PizzaStore trong tay, cả Ethan với Joel hồ hết Điện thoại tư vấn cách thức orderPizza() và điền type pizza mà lại họ có nhu cầu (phô mai, rau củ, v.v.).Để tạo ra các một số loại pizza, phương thức createPizza() được hotline, được khái niệm trong hai lớp bé NYPizzaStore với ChicagoPizzaStore. Như Shop chúng tôi vẫn quan niệm chúng, NYPizzaStore tạo thành một dòng bánh pizza theo phong thái NY với ChicagoPizzaStore tạo thành mẫu bánh pizza hình trạng Chicago. Trong cả nhị trường hòa hợp, Pizza được trả về phương thức orderPizza().Phương thơm thức orderPizza() lừng chừng một số loại pizza như thế nào được tạo ra, mà lại nó biết nó là 1 loại pizza với nó sẵn sàng, có tác dụng bánh, giảm, với đóng hộp mang đến Ethan cùng Joel.

Hãy thuộc khám nghiệm coi những cái pizza này thực thụ được tiếp tế ra sao lúc order…


Chúng ta vừa quên một thứ: TẠO PIZZA!

PizzaStore của chúng ta sẽ không thịnh hành ví như không có một số loại pizza, bởi vậy hãy làm cho chúng:


Bây giờ bọn họ chỉ cần một trong những lớp nhỏ cụ thể … làm cầm làm sao nhằm xác định cheese pizzas vẻ bên ngoài New York tốt Chicago?


Cuối cùng cũng đến thời gian biết về Factory Pattern

Tất cả những mẫu factory đóng gói vấn đề sinh sản đối tượng. Mẫu Factory Pattern gói gọn câu hỏi tạo đối tượng người tiêu dùng bằng cách nhằm những lớp con ra quyết định đông đảo đối tượng người tiêu dùng sẽ tạo nên. Hãy thuộc bình chọn những sơ thứ lớp này giúp xem ai là “người đùa chính” trong chủng loại này:

Lớp Creator


Một mắt nhìn khác của Factory Pattern: hệ thống phân cấp lớp dạng tuy vậy song

Chúng tôi sẽ thấy rằng factory pattern cung ứng một framework bằng cách hỗ trợ một cách tiến hành orderPizza() được kết phù hợp với một factory method. Một bí quyết khác giúp xem mẫu mã này như một framework là vào biện pháp nó gói gọn “đọc tin về sản phẩm” vào mỗi creator.

Hãy cùng cẩn thận nhì hệ thống phân cung cấp lớp đặt tuy nhiên tuy vậy và xem chúng liên quan như thế nào:


Thiết kế

Chúng ta bắt buộc một các loại bánh pizza khác cho người California. Vẽ một tập hòa hợp các lớp tuy nhiên tuy vậy khác cơ mà bạn cần nhằm thêm 1 vùng California mới vào chuỗi cửa hàng PizzaStore của Shop chúng tôi.


Được rồi, hiện giờ viết năm vật dụng kỳ lạ độc nhất vô nhị nhưng chúng ta có thể nghĩ về ra nhằm bỏ trên một loại bánh pizza.

Sau kia, các bạn sẽ chuẩn bị sale làm pizza làm việc California!


Định nghĩa Factory Pattern

Đây là thời hạn để đưa ra có mang thừa nhận của Factory Pattern (giỏi Factory Method Pattern):


(Factory Pattern xác minh một interface nhằm sản xuất một đối tượng người tiêu dùng, dẫu vậy có thể chấp nhận được những lớp bé ra quyết định lớp làm sao sẽ tạo. Factory Pattern giao vấn đề khởi tạo nên một đối tượng người tiêu dùng cụ thể cho lớp con)

Như với mọi nhà máy, Mẫu Factory Pattern đến chúng ta một cách để gói gọn những khởi chế tác của các một số loại rõ ràng. Nhìn vào sơ thứ lớp bên dưới, bạn cũng có thể thấy rằng abstract Creator hỗ trợ cho mình một interface với cách tiến hành khởi tạo ra những đối tượng, còn được gọi là “factory method”. Bất kỳ lớp như thế nào khác implement lớp abstract Creator những được viết nhằm quản lý và vận hành bên trên các sản phẩm (object) được tạo ra bởi factory method. Chỉ các lớp nhỏ thực sự tiến hành cách thức factory và tạo ra sản phẩm (object).

Nhỏng trong tư tưởng đồng ý, bạn sẽ nghe những developer bảo rằng Factory Pattern cho phép những lớp bé ra quyết định lớp nào sẽ tạo. Họ bảo rằng “quyết định” không hẳn bởi quy mô được cho phép chính các lớp nhỏ đưa ra quyết định vào runtime, mà chính vì lớp creator được viết mà lại ko cần biết về các thành phầm thực tế sẽ tiến hành tạo ra, được ra quyết định hoàn toàn do sự sàng lọc của lớp nhỏ.


Không gồm thắc mắc ngớ ngẩn

Hỏi: Có ích lợi gì ko ví như Factory Pattern chỉ gồm một ConcreteCreator?

Trả lời: Factory Pattern khôn cùng hữu ích nếu như khách hàng chỉ có một concrete creator vày bạn đang bóc riêng rẽ Việc xúc tiến thành phầm khỏi bài toán áp dụng nó. Nếu bạn thêm thành phầm bổ sung hoặc biến hóa một Sản phẩm tiến hành, nó sẽ không còn ảnh hưởng đến Creator của chúng ta (vị Creator ko được links chặt chẽ cùng với ngẫu nhiên ConcreteProduct nào).

Hỏi: Có đúng không nhỉ Khi bảo rằng các cửa hàng NY cùng Chicago của công ty chúng tôi được thực thi bằng Simple Factory? Chúng trông giống hệt như nó.

Trả lời: Chúng tương tự nhau, tuy nhiên được áp dụng theo các phương pháp khác biệt. Mặc dù bài toán thực thi của mỗi concrete store trông hết sức tương tự SimplePizzaFactory, hãy hãy nhờ rằng những concrete store đang extends một tấm đã khái niệm createPizza() là một thủ tục trừu tượng. Tùy thuộc vào mỗi siêu thị nhằm xác minh hành động của cách tiến hành createPizza(). Trong Simple Factory, factory là một đối tượng người dùng không giống được kết hợp với PizzaStore.

Hỏi: Có bắt buộc factory method và Creator luôn trừu tượng?

Trả lời: Không, bạn có thể khẳng định factory method khoác định để cung ứng một vài thành phầm cụ thể. lúc đó, chúng ta luôn luôn có phương tiện tạo thành phầm trong cả Lúc không tồn tại lớp con của Creator.

Hỏi: Mỗi cửa hàng hoàn toàn có thể tạo thành bốn các loại pizza không giống nhau dựa trên type được truyền vào. Có cần toàn bộ các creator con hồ hết tạo nên những nhiều loại sản phẩm, xuất xắc thỉnh thoảng chúng chỉ làm cho một loại?

Trả lời: Chúng tôi sẽ implemented số đông gì biết đến thành tsi mê số mang lại factory method. Nó có thể chế tác nhiều hơn thế nữa một đối tượng người sử dụng dựa vào tham mê số được truyền vào, như chúng ta thấy. Tuy nhiên, thông thường, một xí nghiệp sản xuất chỉ sản xuất một đối tượng và không tồn tại tmê mẩn số truyền vào. Cả nhì gần như là giải pháp viết thích hợp lệ của mẫu mã.

Hỏi: Các loại tsi mê số của khách hàng chắc là không bình yên. Tôi chỉ truyền một chuỗi String! Điều gì sẽ xảy ra giả dụ tôi thử khám phá một món “CalmPizza” (ý nói truyền tùy ý một chuỗi String nào thì cũng được)?

Trả lời: Quý Khách chắc chắn rằng là đúng và điều ấy là nguyên ổn nhân xẩy ra lỗi thời hạn chạy (runtime error). Có một vài ba nghệ thuật hoàn toàn có thể áp dụng để sinh sản một tsay mê số an toàn rộng hoặc một phương pháp nói không giống, bảo đảm an toàn lỗi trong các parameter rất có thể được catch (bắt) tại thời gian biên dịch. Chẳng hạn, bạn cũng có thể tạo ra các đối tượng người dùng thay mặt cho các một số loại tmê mệt số, sử dụng các hằng số hoặc trong Java 5, chúng ta cũng có thể thực hiện Enums.

Hỏi: Tôi vẫn tồn tại một ít hoảng sợ về sự việc biệt lập giữa Simple Factory với Factory Pattern. Chúng trông rất kiểu như nhau, bên cạnh trong Factory Pattern, lớp returnspizza là một lớp con. Quý khách hàng rất có thể phân tích và lý giải không?

Trả lời: quý khách hàng đúng về điều ấy, các lớp bé trông khôn xiết kiểu như Simple Factory, tuy nhiên, lưu ý đến của Simple Factory hệt như một “shot deal”, trong khi cùng với Factory Pattern, bạn đang sản xuất một framework nhằm cho phép những lớp nhỏ ra quyết định việc thực hiện làm sao sẽ được sử dụng. lấy ví dụ, cách tiến hành orderPizza() trong Factory Pattern cung cấp một framework phổ biến để tạo ra những loại pizza (dựa trên cách tiến hành factory) khi đó các lớp bé sẽ thẳng tạo nên những chiếc pizza. Bằng biện pháp phân lớp PizzaStore, bạn đưa ra quyết định thành phầm ví dụ làm sao orderPizza() vẫn return. So sánh cùng với SimpleFactory, cung ứng cho mình một cách để đóng gói bài toán tạo đối tượng người sử dụng, cơ mà ko chất nhận được bạn linh hoạt nlỗi Factory Pattern vì chưng không tồn tại phương pháp nào nhằm biến hóa các sản phẩm bạn tạo nên.

Sư prúc với Học trò…

Sư phụ: Grasshopper, cho thầy biết bé vẫn học được đầy đủ gì?

Học trò: Sư prúc, bé đã triển khai phân tích của mình về “gói gọn phần lớn gì cố đổi” về phạm vi.

Sư phụ: Tiếp tục đi…

Học trò: Con vẫn học được rằng tín đồ ta rất có thể đóng gói code tạo nên các đối tượng. Lúc bao gồm code khởi tạo ra những lớp rõ ràng, đó là một khu vực liên tiếp biến hóa. Con sẽ học được một kỹ thuật Hotline là “factory pattern”, được cho phép con gói gọn hành vi khởi chế tạo ra này.

Sư phụ: Và phần lớn “factory” đó, bọn chúng hữu ích ích gì?

Học trò: Có không ít. Bằng cách đặt tất cả code tạo nên đối tượng của bản thân mình vào một object hoặc phương thức, con tách giống nhau vào code của chính bản thân mình và hỗ trợ một khu vực để tiến hành Việc duy trì. Điều này cũng Tức là các client chỉ dựa vào vào những interface nỗ lực vì những lớp cụ thể quan trọng để tạo những đối tượng người tiêu dùng. Nlỗi con vẫn học tập được trong những nghiên cứu của chính mình, điều này được cho phép nhỏ lập trình trên một bối cảnh (program lớn an interface), chưa phải là lập trình sẵn bên trên implementation cùng điều đó tạo cho code của con linc hoạt hơn và có thể không ngừng mở rộng về sau.

Sư phụ: Vâng Grasshopper, bạn dạng năng OO của nhỏ vẫn cải tiến và phát triển. Con gồm bất kỳ thắc mắc đến sư prúc ngày lúc này không?

Học trò: Sư phú, nhỏ biết rằng bằng phương pháp đóng gói bài toán chế tạo đối tượng người tiêu dùng, bé sẽ “coding to lớn abstractions” (code tới việc trừu tượng) với bóc code client của bé ngoài các triển khai thực tiễn. Nhưng factory code vẫn đề nghị sử dụng những lớp concrete (lớp nhỏ kế thừa factory) để tạo những đối tượng thực. Đây có bắt buộc là 1 trong cú lừa?

Sư phụ: Grasshopper, Khởi sản xuất đối tượng người sử dụng là một trong những thực tế của cuộc sống; chúng ta phải tạo lập những đối tượng người dùng hoặc họ sẽ không còn lúc nào sinh sản một chương trình Java. Nhưng, với con kiến ​​thức về thực tế này, chúng ta cũng có thể xây cất code của mình, do vậy họ đang kiểm soát và điều chỉnh creation code này y hệt như nhỏ chiên cơ mà len của chính nó đang kéo qua mắt con (nguyên ổn văn: whose wool you would pull over your eyes – thành ngữ chỉ sự lừa ai đó). Sau lúc được kiểm soát và điều chỉnh, chúng ta cũng có thể bảo vệ cùng bảo trì code khởi chế tạo ra (creation code). Nếu họ để creation code của bản thân mình chạy tự do, thì họ sẽ không khi nào tích lũy được “len” của nó.

Học trò: Sư phụ, nhỏ thấy sự thật vào này.

Sư phụ: Nlỗi thầy sẽ biết con đã làm. Bây tiếng, đi và suy nghĩ về các phụ thuộc vào đối tượng (object dependencies).

Xem thêm: Nghĩa Của Từ Role Model Là Gì Trong Tiếng Việt? Role Models Có Nghĩa Là Gì

Trung tâm Pizza “hết sức phú thuộc”

Hãy vờ vịt nlỗi các bạn đã có lần nghe nói đến Factory Pattern. Ở đây, một phiên bản của PizzaStore ko sử dụng factory pattern; hãy đếm số đối tượng người dùng con chế tác pizza lớp này phụ thuộc. Nếu chúng ta đang thêm pizza hình trạng California vào PizzaStore này, thì tất cả bao nhiêu đối tượng đã dựa vào vào đó?

*

Nhìn vào sự nhờ vào đối tượng

Khi chúng ta thẳng khởi chế tạo ra một đối tượng người dùng, bạn phụ thuộc vào lớp cụ thể của nó. Hãy xem xét lại PizzaStore tương đối nhiều sự phụ thuộc vào của Cửa Hàng chúng tôi. Nó tạo thành toàn bộ những đối tượng người tiêu dùng pizza ngay trong lớp PizzaStore cố kỉnh bởi vì ủy thác cho 1 lớp Factory.

Nếu chúng ta vẽ một sơ đồ gia dụng thể hiện phiên bản đó của PizzaStore với tất cả các đối tượng nhưng nó phụ thuộc vào, thì ở chỗ này, nó trông như thế nào:

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *