[Design Patterns] Abstract Factory

Xem bài viết trước để biết về Factory: [Design Patterns] Factory Pattern Abstract Factory là dạng thức được đưa ra để làm việc xoay quanh trọng tâm tạo ra một “siêu” Factory đóng vai trò tạo ra các Factory khác. Abstract Factory cũng được xếp vào nhóm các dạng thức Khởi Tạo. Trong phép triển

Xem bài viết trước để biết về Factory: [Design Patterns] Factory Pattern

Abstract Factory là dạng thức được đưa ra để làm việc xoay quanh trọng tâm tạo ra một “siêu” Factory đóng vai trò tạo ra các Factory khác. Abstract Factory cũng được xếp vào nhóm các dạng thức Khởi Tạo.

Trong phép triển khai Abstract Factory, 01 interface được sử dụng để đảm nhiệm vai trò tạo ra 01 Factory của các object liên quan mà không cần chỉ ra đặc định class của các object đó. Mỗi Factory được khởi tạo sẽ có thể giúp chúng ta khởi tạo các object thực thể như đã biết trong bài Factory Pattern.

Áp dụng triển khai

sơ đồ các class

  • Chúng ta sẽ tạo ra 01 interface Shape mở public.
  • 04 class triển khai interface này.
  • Ở bước tiếp theo, 01 class AbstractFactory sẽ được tạo ra.
  • Kế đến là 02 class Factory mở rộng AbstractFactory.
  • Sau đó là một phương thức static để khởi tạo các object Factory.
  • Cuối cùng, trong mainPatternDemo, chúng ta sử dụng phương thức static để tạo ra các Factory. Rồi sau đó truyền vào thông tin về kiểu object hình học muốn tạo ra (triangle / square).

Về mặt quản lý code, chúng ta sẽ có 01 package được đặt tên là shapefactory. Package này sẽ chứa các thành phầnpublictới code client bao gồminterface Shapeclass AbstractFactory. Tất cả các thành phần còn lại bao gồm04 classtriển khaiShape02 classmở rộngAbstractFactorysẽ đều sử dụngaccess modifierdefault. Do đó, toàn bộ tiến trình logic để khởi tạo cácFactorycũng như cácShapeđều không để mở về phía code client và các tham chiếu đều được thực hiện thông quaabstract classinterface`.

Bước 1

Tạo 01 interface Shape mở public.

shapefactory/Shape.java

packageshapefactory;publicinterfaceShape{voiddraw();}

Bước 2

Tạo các class triển khai giao diện Shape.

shapefactory/NormalTriangle.java

packageshapefactory;classNormalTriangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tam giác bình thường.");}}

shapefactory/NormalSquare.java

packageshapefactory;classNormalSquareimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình vuông bình thường.");}}

shapefactory/RoundedTriangle.java

packageshapefactory;classRoundedTriangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tam giác có các góc bo tròn.");}}

shapefactory/RoundedSquare.java

packageshapefactory;classRoundedSquareimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình vuông có các góc bo tròn.");}}

Bước 3

Tạo 01 class abstract để khái quát hóa các Factory.

shapefactory/AbstractFactory.java

packageshapefactory;publicabstractclassAbstractFactory{abstractpublicShapecreateShape(String type);}

Bước 4

Tạo các class mở rộng AbstractFactory giúp khởi tạo các Shape với thông tin được cung cấp.

shapefactory/NormalFactory.java

packageshapefactory;classNormalFactoryextendsAbstractFactory{@OverridepublicShapecreateShape(String type){if(type ==null)returnnull;if(type.equalsIgnoreCase("triangle"))returnnewNormalTriangle();if(type.equalsIgnoreCase("square"))returnnewNormalSquare();elsereturnnull;}}

shapefactory/RoundedFactory.java

packageshapefactory;classRoundedFactoryextendsAbstractFactory{@OverridepublicShapecreateShape(String type){if(type ==null)returnnull;if(type.equalsIgnoreCase("triangle"))returnnewNormalTriangle();if(type.equalsIgnoreCase("square"))returnnewNormalSquare();elsereturnnull;}}

Bước 5

Thêm phương thức static cho AbstractFactory để khởi tạo các object Factory cụ thể.

shapefactory/AbstractFactory

packageshapefactory;publicabstractclassAbstractFactory{publicstaticAbstractFactorycreateFactory(boolean rounded){if(rounded)returnnewRoundedFactory();elsereturnnewNormalFactory();}abstractpublicShapecreateShape(String type);}

Bước 6

Sử dụng phương thức static vừa rồi để khởi tạo các objectFactory. Sau đó, sử dụng các Factory để khởi tạo các object hình học bằng cách truyền vào thông tin về kiểu Shape.

PatternDemo.java

importshapefactory.AbstractFactory;importshapefactory.Shape;publicclassDesignPatterns{publicstaticvoidmain(String[] args){// Tạo ra một Factory cho các hình 2D bình thườngAbstractFactory normalShapeFactory =AbstractFactory.createFactory(false);// Yêu cầu khởi tạo 1 hình tam giác bình thường và gọi `draw()`Shape normalTriangle = normalShapeFactory.createShape("triangle");
      normalTriangle.draw();// Yêu cầu khởi tạo 1 hình vuông bình thường và gọi `draw()`Shape normalSquare = normalShapeFactory.createShape("square");
      normalSquare.draw();// Tạo ra một Factory cho các hình 2D bo tròn gócAbstractFactory roundedShapeFactory =AbstractFactory.createFactory(true);// Yêu cầu khởi tạo 1 hình tam giác bo góc và gọi `draw()`Shape roundedTriangle = roundedShapeFactory.createShape("triangle");
      roundedTriangle.draw();// Yêu cầu khởi tạo 1 hình vuông bình thường và gọi `draw()`Shape roundedSquare = roundedShapeFactory.createShape("square");
      roundedSquare.draw();}}

Bước 7

Kiểm chứng lại kết quả được in ra ở console.

console

Một hình tam giác bình thường.
Một hình vuông bình thường.
Một hình tam giác với các góc bo tròn.
Một hình vuông với các góc bo tròn.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ