HomeĐời SốngAbstract factory pattern là gì

Abstract factory pattern là gì

18:15, 08/04/2021

Factory Pattern – Hãy sẵn sàng “tiếp đón” một vài ba thiết kế OO “phối kết hợp lỏng lẻo”

Có nhiều thiết bị để tạo nên đối tượng cố kỉnh do áp dụng tân oán tử new. Với Factory Pattern bạn sẽ học tập được rằng khởi chế tạo ra là một chuyển động chưa phải cơ hội như thế nào cũng rất được triển khai công khai, cùng điều đó thường dẫn mang đến các vụ việc về việc phụ thuộc. Và chúng ta không muốn điều này, cần không? Tìm phát âm làm cho nắm nào Factory Pattern rất có thể cứu vãn chúng ta khỏi sự dựa vào thân các lớp.

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


*

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

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


*

*

Tại đây, công ty chúng tôi vẫn tất cả một vài lớp cụ thể được khởi tạo với quyết định khởi tạo nên chỉ dẫn trong thời gian chạy (runtime) tùy ở trong vào một trong những điều kiện.

Lúc chúng ta thấy code cố kỉnh này, các bạn biết rằng khi đến cơ hội nên thay đổi hoặc mở rộng, bạn sẽ phải msinh hoạt lại code này cùng chất vấn rất nhiều gì bắt buộc thêm (hoặc xóa). Đôi khi một số loại code cố gắng này dứt trong một vài phần của áp dụng khiến Việc duy trì với cập nhật trnghỉ ngơi cần khó khăn rộng và dễ dẫn đến lỗi hơn.

Nhưng các bạn phải tạo lập một đối tượng cùng Java chỉ cung cấp mang lại họ một biện pháp độc nhất nhằm chế tạo ra một đối tượng người tiêu dùng (new), đề nghị không? Vì vậy, ta đang làm gì? Có điều gì không đúng Lúc thực hiện “new”?

Về khía cạnh chuyên môn, không có gì sai cùng với new cả, nó là một phần cơ bạn dạng của Java. Thủ phạm thực thụ là fan chúng ta cũ của bọn họ – SỰ THAY ĐỔI, SỰ THAY ĐỔI ảnh hưởng đến việc thực hiện new của chúng ta.

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

Vậy bạn có thể làm cho gì? Đây là thời điểm chúng ta cũng có thể phụ thuộc Nguyên tắc kiến tạo OO nhằm tìm tìm đầu mối. Hãy hãy nhờ rằng, vẻ ngoài trước tiên của bọn họ (Strategy) tương quan tới việc thay đổi cùng khuyên bảo họ xác định những kỹ lưỡng không giống nhau với bóc chúng ngoài đầy đủ gì vẫn giữ nguyên.

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

Làm rứa nào chúng ta có thể đem tất cả những đoạn code “khởi tạo lớp con” trong vận dụng của doanh nghiệp với tách bóc hoặc đóng gói chúng khỏi phần lớn phần còn lại?

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

Hãy bảo rằng chúng ta bao gồm một cửa hàng pizza với là công ty cửa hàng pizza tiên tiến và phát triển sinh hoạt Objectville, chúng ta cũng có thể đã viết một số trong những mẫu code như thế này:


*

Nhưng bạn phải các loại pizza hơn…

Vì vậy, sau đó bạn thêm một trong những dòng code quan niệm nhiều loại pizza phù hợp và tiếp đến khởi tạo ra bánh pizza:


*

Nhưng bắt buộc thêm nhiều các loại pizza nữa

Quý khách hàng phân biệt rằng tất cả các đối phương đối đầu của doanh nghiệp vẫn thêm 1 vài loại pizza “hòa hợp thời trang” vào thực 1-1 của họ: Pizza ClamVeggie Pizza. Rõ ràng bạn cần theo kịp kẻ thù, vì vậy các bạn sẽ thêm các mục này vào thực đối chọi của chính mình. Và cách đây không lâu chúng ta ko cung cấp được không ít bánh Greek Pizzas, vì vậy chúng ta ra quyết định nhiều loại bỏ nó thoát khỏi thực đơn:


Rõ ràng, việc cách xử lý khởi sản xuất bên trên đích thực quấy rồi đến cách tiến hành orderPizza() của họ với ngnạp năng lượng quán triệt nó “đóng cho vấn đề sửa đổi”. Nhưng bây giờ bọn họ vẫn biết đồ vật gi đã thay đổi cùng đồ vật gi không, chắc rằng đã đến khi gói gọn nó.

Đóng gói câu hỏi khởi tạo thành đối tượng

Vì vậy, hiện nay họ hiểu được đã tốt hơn khi gửi vấn đề chế tác đối tượng người sử dụng thoát ra khỏi cách thức orderPizza(). Nhưng bằng phương pháp nào? Chà, hầu hết gì công ty chúng tôi đang làm cho là rước phần code sinh sản pizza và chuyển nó ra một đối tượng người sử dụng khác chỉ tương quan đến sự việc tạo ra pizza.


Chúng tôi đang khắc tên đến đối tượng người tiêu dùng bắt đầu này: chúng tôi Call nó là Factory.

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

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

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

Chúng tôi đã ban đầu cùng với chủ yếu nhà máy sản xuất. Những gì công ty chúng tôi sẽ làm là có mang một tấm gói gọn việc sản xuất đối tượng người tiêu dùng mang đến tất cả những các loại pizza. Nó đây…


Không có thắc mắc nào ngớ ngẩn

Hỏi: Lợi ích của câu hỏi này là gì? Có vẻ nhỏng bọn họ chỉ đã đẩy sự việc qua một đối tượng người dùng không giống.

Trả lời: Một vấn đề cần nhớ là SimplePizzaFactory rất có thể có khá nhiều client. Chúng ta chỉ thấy cách tiến hành orderPizza() Hotline mang đến nó; tuy vậy, có thể tất cả một lớp client khác – PizzaShopMenu cũng sử dụng factory nhằm chế tạo pizza và lấy biểu lộ với giácủa nó. Chúng ta cũng hoàn toàn có thể gồm một tấm HomeDelivery Call mang lại xí nghiệp sản xuất tạo pizza theo cách không giống với lớp PizzaShop, nhưng mà tất cả chúng những là client của Factory.

Vì vậy, bằng phương pháp đặt việc khởi sinh sản pizza trong không ít lớp, lúc này bọn họ chỉ tất cả một tấm để triển khai sửa thay đổi lúc cần thiết. Đừng quên, họ cũng sắp tới xóa Việc khởi chế tạo lớp con khỏi phương thức orderPizza() !

Hỏi: Tôi vẫn thấy một thi công tương tự như, trong những số đó một factory sẽ được quan niệm là 1 cách làm static. Có sự khác hoàn toàn gì không?

Trả lời: Định nghĩa factory là 1 cách tiến hành static là 1 nghệ thuật phổ cập với thường xuyên được gọi là 1 trong “static factory”. Tại sao sử dụng phương thức tĩnh ư? Bởi vày chúng ta không yêu cầu khởi chế tác một đối tượng người sử dụng để áp dụng cách thức factory. Nhưng hãy nhớ rằng nó cũng có thể có sự bất lợi là chúng ta bắt buộc bao gồm lớp bé cùng thay đổi hành vi của cách làm get, set.

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

Bây giờ là thời gian để sửa code. Những gì Shop chúng tôi ý muốn làm cho là dựa vào factory để tạo ra những một số loại pizza. Dưới đấy là phần đa cố kỉnh đổi:

Bây tiếng lớp PizzaStore (client) vẫn tsay đắm chiếu mang lại SimplePizzaFactory (factory) của họ.


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

Chúng ta biết rằng vấn đề kết hợp những object (composition) chũm bởi vì implementation có thể chấp nhận được chúng ta thay đổi hành động một giải pháp linh hoạt trong runtime cũng chính vì chúng hoàn toàn có thể đổi khác thân vào với ngoại trừ bài toán thừa kế. Làm cố gắng nào bạn có thể sử dụng điều đó vào PizzaStore? Những thực hiện factory như thế nào chúng ta cũng có thể đàm phán giữa trong và ngoài?

Định nghĩa Simple Factory

Simple Factory ko thực thụ là 1 trong mẫu mã thiết kế; nó là 1 trong những programming idiom (thành ngữ lập trình). Nhưng nó thường xuyên được thực hiện, vì chưng vậy chúng tôi sẽ Tặng đến nó một danh hiệu “Head First Pattern Honorable Mention”.


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

Simple Factory chưa phải là 1 trong những mẫu mã THỰC SỰ, không Có nghĩa là họ không nên chú ý biện pháp mà nó kết phù hợp với nhau. Hãy thuộc coi sơ đồ dùng lớp của Cửa hàng Pizza mới của chúng tôi:


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

* Chỉ là 1 lời nhắc khác: trong các chủng loại thi công, cụm từ “implement an interface”, chưa hẳn thời điểm nào cũng Có nghĩa là “tạo một lớp implement một Java interface, bằng cách sử dụng trường đoản cú khóa “implements” vào knhì báo lớp con”. Một lớp ví dụ implements một thủ tục xuất phát điểm từ một supertype (rất 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 shop pizza

(Nhượng quyền uy tín phát âm nôm mãng cầu là được cho phép sử dụng uy tín của bạn để mở một chi nhánh không giống, cùng chia lại lợi tức đầu tư cho bạn. Royal tea – Tthẩm tra sữa sinh hoạt tất cả những nơi không phải cùng 1 tín đồ download, này đã được nhượng quyền lại cho những người khác)

Objectville PizzaStore của bạn sẽ làm tốt nhất có thể đến nỗi các bạn vẫn vượt qua kẻ thù với hiện giờ hầu hết người đều muốn có một PizzaStore sống khu vực chúng ta sinh sống. Là fan nhượng quyền (franchiser), bạn có nhu cầu đảm bảo unique của hoạt động nhượng quyền với vì chưng vậy bạn muốn bọn họ thực hiện lại code (nhưng bạn bạn đang quăng quật thời hạn ra test) để những cửa hàng được nhượng quyền thực hiện.

Nhưng tất cả sự khác biệt về quần thể vực? Mỗi chỗ được nhượng quyền có thể mong mỏi cung cấp những nhiều loại pizza không giống nhau (New York, Chicago cùng California,…), tùy trực thuộc vào vị trí cửa hàng được nhượng quyền với nhu cầu của các người sành pizza sống địa phương thơm.


Chúng tôi đã thấy một giải pháp tiếp cận …

Nếu Shop chúng tôi vứt bỏ lớp SimplePizzaFactory cùng tạo ra bố lớp factory khác: NYPizzaFactory, ChicagoPizzaFactory CaliforniaPizzaFactory, thì Cửa Hàng chúng tôi rất có thể phối hợp PizzaStore với cùng một factory cân xứng cùng nhượng quyền tmùi hương mại là vấn đề tốt. Đó là 1 biện pháp tiếp cận.

Hãy coi điều đó đã trông nlỗi …


Nhưng bạn có nhu cầu điều hành và kiểm soát quality rộng một ít …

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


Xem xét lại vụ việc một ít, các bạn thấy rằng đa số gì bạn đích thực hy vọng làm là tạo ra một kích thước kết nối siêu thị cùng việc tạo ra pizza với nhau, cơ mà vẫn được cho phép đều đồ vật vẫn linh hoạt. (Với SimpleFactory thì ví dụ nhiều người đang đề nghị các cửa hàng nhượng quyền đề xuất theo một độ lớn duy nhất)

Trong code trước đó của Cửa Hàng chúng tôi, trước SimplePizzaFactory, công ty chúng tôi đang bao gồm code làm bánh pizza nối liền với PizzaStore, nhưng nó ko linc hoạt. Vì vậy, làm cho nạm làm sao chúng ta có thể gồm bánh pizza của bọn chúng tôi?

Một Framework mang lại siêu thị pizza

Có một phương pháp để “bạn dạng địa hóa” tất cả những hoạt động làm bánh pizza mang lại lớp PizzaStore, nhưng mà vẫn cho phép nhượng quyền thoải mái theo style của từng khoanh vùng riêng biệt.

Những gì công ty chúng tôi sẽ làm là gửi phương thức createPizza() trở lại vào PizzaStore, cơ mà lần này là một phương thức trừu tượng (abstract), kế tiếp tạo một tấm con PizzaStore cho mỗi dạng hình vùng.

Đầu tiên, hãy xem các biến hóa của PizzaStore:


Bây tiếng Shop chúng tôi vẫn tất cả một shop đã hóng những lớp nhỏ kế thừa; công ty chúng tôi sẽ có được những lớp bé đến từng loại Khu Vực (NYPizzaStore, ChicagoPizzaStore, CaliforniaPizzaStore) và mỗi lớp bé sẽ đưa ra quyết định về đông đảo gì khiến cho một mẫu bánh pizza. Hãy coi vấn đề đó vẫn vận động thế nào.

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

Hãy nhớ là, PizzaStore đã có một hệ thống mua hàng được test chu đáo vào thủ tục orderPizza() và bạn có nhu cầu bảo vệ rằng nó phù hợp cùng với tất cả các nơi được nhượng quyền.

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

Xem thêm: Nghĩa Của Từ Creditworthiness Là Gì, Khả Năng Trả Được Nợ (Creditworthiness) Là Gì


Chà, hãy suy nghĩ về nó theo quan điểm của cách làm orderPizza() của lớp PizzaStore: nó được định nghĩa vào lớp trừu tượng PizzaStore, tuy nhiên những nhiều loại cụ thể chỉ được chế tạo trong các lớp con.


Bây tiếng, để phát âm thêm một ít, cách tiến hành orderPizza() thực hiện rất nhiều vật dụng với một đối tượng người dùng Pizza (như chuẩn bị, nướng, giảm, đóng góp hộp), tuy nhiên chính vì Pizza là abstract, orderPizza() chần chờ lớp con thực thụ là gì, bao gồm tương quan ra sao. Nói phương pháp không giống, nó sẽ tách ra!


lúc orderPizza() Hotline createdPizza(), một trong những lớp con của các bạn sẽ được điện thoại tư vấn hành vi để tạo ra một loại bánh pizza. Những loại pizza nào sẽ được làm? Chà, điều này ra quyết định do sự chọn lựa siêu thị pizza cơ mà bạn mua tự NYStylePizzaStore hoặc ChicagoStylePizzaStore.

Vì vậy, gồm một quyết định cơ mà những lớp nhỏ đưa ra vào thời gian thực (runtime) đúng không? Không, nhưng lại theo ý kiến của orderPizza(), nếu khách hàng lựa chọn NYStylePizzaStore, lớp bé này sẽ xác minh nhiều loại pizza nào được làm. Vì vậy, những lớp bé chưa hẳn là fan quyết định thực thụ – nhưng chính là chúng ta, chúng ta quyết định bằng phương pháp chọn shop như thế nào bạn có nhu cầu – cơ mà lớp nhỏ lại xác minh một số loại pizza làm sao được gia công.

Hãy tạo thành một PizzaStore

Là một nơi được nhượng quyền sẽ có ích ích của chính nó. Quý khách hàng nhận ra tất cả các tác dụng của lớp PizzaStore miễn giá tiền. Tất cả các siêu thị địa pmùi hương đề nghị làm là phân lớp PizzaStore cùng cung cấp cách tiến hành createPizza() sinh sản các một số loại Pizza của họ. Chúng ta sẽ quyên tâm bố phong cách pizza lớn cho những người được nhượng quyền.

Ở phía trên, phong thái Quanh Vùng New York:


Lưu ý rằng thủ tục orderPizza() trong lớp phụ thân lần chần các loại Pizza như thế nào họ đã tạo; Nó chỉ biết nó rất có thể sẵn sàng, nướng, giảm, với đóng góp hộp!

Một Lúc họ sẽ gây ra các lớp con PizzaStore, đã đến khi xem về vấn đề đặt cài đặt một hoặc nhị chiếc bánh pizza. Nhưng trước lúc chúng ta làm cho điều này, vì sao các bạn không trường đoản cú sản xuất các cửa hàng pizza Chicago Style với California Style? Lấy giấy ra cùng làm đi nào.

Mô tả một cách tiến hành factory

Chỉ với một vài ba chuyển đổi đến PizzaStore, Shop chúng tôi đang đưa từ việc chỉ bao gồm một đối tượng người dùng cách xử lý bài toán khởi sản xuất những lớp rõ ràng của công ty chúng tôi thành một tập phù hợp các lớp bé hiện tại đang đảm nhiệm trách nhiệm đó. Hãy nhằm chú ý kỹ hơn:


Vậy có tác dụng rứa làm sao nhằm bọn họ đặt hàng?

Thứ nhất, Joel và Ethan cần một miêu tả (instance) của PizzaStore. Joel thì nên cần khởi tạo thành một ChicagoPizzaStore cùng Ethan nên một NYPizzaStore.Với một PizzaStore vào tay, cả Ethan với Joel đầy đủ call phương thức orderPizza() và điền type pizza mà lại người ta muốn (phô mai, rau củ, v.v.).Để tạo ra những nhiều loại pizza, cách thức createPizza() được Hotline, được khái niệm trong nhì lớp nhỏ NYPizzaStore với ChicagoPizzaStore. Như chúng tôi sẽ định nghĩa chúng, NYPizzaStore tạo nên một mẫu bánh pizza theo phong thái NY và ChicagoPizzaStore tạo nên cái bánh pizza dạng hình Chicago. Trong cả hai trường phù hợp, Pizza được trả về thủ tục orderPizza().Phương thơm thức orderPizza() chần chờ các loại pizza nào được tạo nên, tuy vậy nó biết nó là 1 trong các loại pizza và nó chuẩn bị, làm cho bánh, cắt, cùng đóng góp vỏ hộp cho Ethan cùng Joel.

Hãy thuộc soát sổ xem những cái pizza này thực thụ được cung ứng như thế nào Lúc order…


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

PizzaStore của bọn họ sẽ không phổ biến giả dụ không tồn tại một trong những các loại pizza, bởi vì vậy hãy có tác dụng chúng:


Bây giờ chúng ta chỉ việc một số lớp con rõ ràng … có tác dụng nắm như thế nào nhằm xác định cheese pizzas loại New York tuyệt Chicago?


Cuối cùng cũng cho cơ hội biết về Factory Pattern

Tất cả các chủng loại factory gói gọn việc chế tác đối tượng người dùng. Mẫu Factory Pattern đóng gói vấn đề tạo ra đối tượng người dùng bằng phương pháp để những lớp con quyết định các đối tượng người tiêu dùng sẽ khởi tạo. Hãy thuộc kiểm tra các sơ đồ vật lớp này giúp thấy ai là “tín đồ đùa chính” vào mẫu mã này:

Lớp Creator


Một góc nhìn không giống của Factory Pattern: khối hệ thống phân cung cấp lớp dạng tuy nhiên song

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

Hãy thuộc xem xét nhị hệ thống phân cấp lớp đặt song tuy vậy với coi bọn chúng liên quan như thế nào:


Thiết kế

Chúng ta nên một loại bánh pizza không giống cho những người California. Vẽ một tập phù hợp những lớp tuy vậy tuy vậy khác mà lại bạn cần nhằm thêm 1 vùng California new vào chuỗi siêu thị PizzaStore của Cửa Hàng chúng tôi.


Được rồi, hiện nay viết năm trang bị kỳ lạ độc nhất nhưng bạn có thể nghĩ ra để bỏ lên trên một mẫu bánh pizza.

Sau kia, các bạn sẽ sẵn sàng kinh doanh làm cho pizza ở California!


Định nghĩa Factory Pattern

Đây là thời gian để lấy ra định nghĩa chính thức của Factory Pattern (xuất xắc Factory Method Pattern):


(Factory Pattern khẳng định một interface nhằm tạo ra một đối tượng, mà lại có thể chấp nhận được các lớp nhỏ quyết định lớp nào sẽ tạo nên. Factory Pattern giao Việc khởi chế tạo một đối tượng người dùng rõ ràng mang đến lớp con)

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

Như trong định nghĩa thỏa thuận, các bạn sẽ nghe các developer bảo rằng Factory Pattern được cho phép những lớp con quyết định lớp làm sao sẽ tạo. Họ bảo rằng “quyết định” chưa phải vì chưng mô hình chất nhận được chính những lớp bé đưa ra quyết định trong runtime, mà lại bởi vì lớp creator được viết mà không cần biết về những sản phẩm thực tiễn sẽ được chế tạo, được quyết định hoàn toàn vày sự tuyển lựa của lớp bé.


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

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

Trả lời: Factory Pattern hết sức hữu ích nếu như khách hàng chỉ gồm một concrete creator bởi vì bạn đang tách riêng rẽ câu hỏi xúc tiến sản phẩm ngoài bài toán sử 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 thực thi, nó sẽ không còn ảnh hưởng mang lại Creator của chúng ta (do Creator không được liên kết nghiêm ngặt với ngẫu nhiên ConcreteProduct nào).

Hỏi: Có đúng không nhỉ khi nói rằng các shop NY cùng Chicago của Cửa Hàng chúng tôi được thực hiện bởi Simple Factory? Chúng trông y như nó.

Trả lời: Chúng như là nhau, dẫu vậy được sử dụng theo các phương pháp không giống nhau. Mặc cho dù Việc tiến hành của mỗi concrete store trông khôn xiết như là SimplePizzaFactory, hãy hãy nhớ là các concrete store sẽ extends một tấm đã có mang createPizza() là 1 trong những thủ tục trừu tượng. Tùy thuộc vào mỗi cửa hàng để xác định hành vi của phương thức createPizza(). Trong Simple Factory, factory là một đối tượng người tiêu dùng khác được kết phù hợp với PizzaStore.

Hỏi: Có đề nghị factory method cùng Creator luôn trừu tượng?

Trả lời: Không, chúng ta cũng có thể khẳng định factory method khoác định nhằm cung cấp một trong những sản phẩm cụ thể. khi kia, bạn luôn luôn gồm phương tiện tạo sản phẩm trong cả khi không tồn tại lớp bé của Creator.

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

Trả lời: Chúng tôi đang implemented đông đảo gì được biết thành tmê mẩn số đến factory method. Nó hoàn toàn có thể sản xuất nhiều hơn thế nữa một đối tượng người tiêu dùng dựa vào tmê mẩn số được truyền vào, nlỗi bạn thấy. Tuy nhiên, thông thường, một nhà máy sản xuất chỉ tạo thành một đối tượng người sử dụng cùng không có tđắm đuối số truyền vào. Cả nhị hầu hết là phương pháp viết đúng theo lệ của mẫu.

Hỏi: Các nhiều loại tsi mê số của doanh nghiệp hình như ko an toàn. Tôi chỉ truyền một chuỗi String! Điều gì sẽ xẩy ra nếu tôi từng trải 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 hẳn rằng là đúng cùng điều ấy là nguyên ổn nhân xẩy ra lỗi thời gian chạy (runtime error). Có một vài ba nghệ thuật hoàn toàn có thể áp dụng để tạo thành một tmê man số bình an rộng hoặc một biện pháp nói không giống, bảo vệ lỗi trong các parameter có thể được catch (bắt) tại thời gian biên dịch. Chẳng hạn, chúng ta có thể chế tạo những đối tượng thay mặt đại diện cho các loại tham mê số, sử dụng những hằng số hoặc vào Java 5, bạn có thể thực hiện Enums.

Hỏi: Tôi vẫn còn đó một ít bồn chồn về việc khác biệt giữa Simple Factory cùng Factory Pattern. Chúng trông siêu như thể nhau, không tính trong Factory Pattern, lớp returnspizza là 1 lớp con. Quý Khách có thể phân tích và lý giải không?

Trả lời: Quý Khách đúng về điều này, các lớp bé trông vô cùng tương tự Simple Factory, mặc dù, suy xét của Simple Factorgiống hệt như một “shot deal”, trong lúc với Factory Pattern, nhiều người đang tạo một framework để cho phép các lớp nhỏ quyết định câu hỏi tiến hành làm sao sẽ tiến hành áp dụng. ví dụ như, cách tiến hành orderPizza() vào Factory Pattern cung cấp một framework bình thường để tạo thành các loại pizza (dựa trên cách tiến hành factory) khi ấy những lớp con sẽ thẳng tạo thành các chiếc pizza. Bằng biện pháp phân lớp PizzaStore, bạn đưa ra quyết định sản phẩm cụ thể nào orderPizza() đang return. So sánh với SimpleFactory, cung cấp cho chính mình một cách để đóng gói câu hỏi chế tạo ra đối tượng người dùng, cơ mà ko được cho phép các bạn linc hoạt như Factory Pattern vị không có bí quyết nào để biến hóa các sản phẩm bạn tạo thành.

Sư phụ cùng Học trò…

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

Học trò: Sư phụ, bé đang thực hiện phân tích của chính bản thân mình về “đóng gói những gì nạm đổi” về phạm vi.

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

Học trò: Con đang học được rằng bạn ta có thể gói gọn code tạo thành các đối tượng người sử dụng. khi gồm code khởi sinh sản những lớp rõ ràng, đấy là một khu vực thường xuyên chuyển đổi. Con đã học tập được một chuyên môn Gọi là “factory pattern”, cho phép con gói gọn gàng hành vi khởi tạo này.

Sư phụ: Và phần nhiều “factory” kia, bọn chúng có ích ích gì?

Học trò: Có không hề ít. Bằng giải pháp đặt tất cả code tạo nên đối tượng người dùng của bản thân mình vào một trong những object hoặc thủ tục, bé tránh trùng lặp trong code của bản thân mình với cung ứng một vị trí để triển khai Việc bảo trì. Điều đó cũng Có nghĩa là những client chỉ dựa vào vào những interface cố gắng bởi các lớp ví dụ cần thiết để khởi tạo các đối tượng. Như bé vẫn học được trong các nghiên cứu của bản thân, điều này cho phép nhỏ lập trình sẵn bên trên một hình ảnh (program to lớn an interface), chưa hẳn là thiết kế bên trên implementation và điều này làm cho code của bé linch hoạt hơn với có thể không ngừng mở rộng sau này.

Sư phụ: Vâng Grasshopper, bản năng OO của nhỏ vẫn cải tiến và phát triển. Con gồm ngẫu nhiên câu hỏi mang lại sư phụ ngày bây giờ không?

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

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

Học trò: Sư prúc, nhỏ thấy sự thật trong này.

Sư phụ: Nhỏng thầy vẫn biết con đang có tác dụng. Bây tiếng, đi với quan tâm đến về những nhờ vào đối tượng (object dependencies).

Thương hiệu Pizza “rất phú thuộc”

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

*

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

lúc các bạn trực tiếp khởi chế tạo một đối tượng người tiêu dùng, các bạn phụ thuộc vào lớp cụ thể của nó. Hãy xem lại PizzaStore không hề ít sự phụ thuộc của chúng tôi. Nó tạo nên tất cả những đối tượng người tiêu dùng pizza ngay lập tức trong lớp PizzaStore rứa bởi ủy thác cho 1 lớp Factory.

Nếu bọn họ vẽ một sơ trang bị thể hiện phiên phiên bản đó của PizzaStore cùng tất cả những đối tượng người tiêu dùng cơ mà nó nhờ vào vào, thì tại đây, nó trông như vậy nào: