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 Shape
mởpublic
. - Và
04 class
triển khaiinterface
này. - Ở bước tiếp theo,
01 class AbstractFactory
sẽ được tạo ra. - Kế đến là
02 class Factory
mở 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ểuobject
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ần
publictới code client bao gồm
interface Shapevà
class AbstractFactory. Tất cả các thành phần còn lại bao gồm
04 classtriển khai
Shapevà
02 classmở rộng
AbstractFactorysẽ đều sử dụng
access modifierlà
default. Do đó, toàn bộ tiến trình logic để khởi tạo các
Factorycũng như các
Shapeđều không để mở về phía code client và các tham chiếu đều được thực hiện thông qua
abstract 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