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

- Chúng ta sẽ tạo ra
01 interface Shapemởpublic. - Và
04 classtriển khaiinterfacenày. - Ở bước tiếp theo,
01 class AbstractFactorysẽ được tạo ra. - Kế đến là
02 class Factorymở rộngAbstractFactory. - Sau đó là một phương thức
staticđể khởi tạo cácobject Factory. - Cuối cùng, trong
mainởPatternDemo, chúng ta sử dụng phương thứcstaticđể tạo ra cácFactory. Rồi sau đó truyền vào thông tin về kiểuobjecthì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 Shapevàclass AbstractFactory. Tất cả các thành phần còn lại bao gồm04 classtriển khaiShapevà02 classmở rộngAbstractFactorysẽ đều sử dụngaccess modifierlàdefault. 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 classvàinterface`.
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
