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
package shapefactory; public interface Shape { void draw();
}
Bước 2
Tạo các class
triển khai giao diện Shape
.
shapefactory/NormalTriangle.java
package shapefactory; class NormalTriangle
implements Shape { @Override public void draw() { System.out.println("Một hình tam giác bình thường."); }
}
shapefactory/NormalSquare.java
package shapefactory; class NormalSquare
implements Shape { @Override public void draw() { System.out.println("Một hình vuông bình thường."); }
}
shapefactory/RoundedTriangle.java
package shapefactory; class RoundedTriangle
implements Shape { @Override public void draw() { System.out.println("Một hình tam giác có các góc bo tròn."); }
}
shapefactory/RoundedSquare.java
package shapefactory; class RoundedSquare
implements Shape { @Override public void draw() { 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
package shapefactory; public abstract class AbstractFactory { abstract public Shape createShape(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
package shapefactory; class NormalFactory
extends AbstractFactory { @Override public Shape createShape(String type) { if (type == null) return null; if (type.equalsIgnoreCase("triangle")) return new NormalTriangle(); if (type.equalsIgnoreCase("square")) return new NormalSquare(); else return null; }
}
shapefactory/RoundedFactory.java
package shapefactory; class RoundedFactory
extends AbstractFactory { @Override public Shape createShape(String type) { if (type == null) return null; if (type.equalsIgnoreCase("triangle")) return new NormalTriangle(); if (type.equalsIgnoreCase("square")) return new NormalSquare(); else return null; }
}
Bước 5
Thêm phương thức static
cho AbstractFactory
để khởi tạo các object Factory
cụ thể.
shapefactory/AbstractFactory
package shapefactory; public abstract class AbstractFactory { public static AbstractFactory createFactory(boolean rounded) { if (rounded) return new RoundedFactory(); else return new NormalFactory(); } abstract public Shape createShape(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
import shapefactory.AbstractFactory;
import shapefactory.Shape; public class DesignPatterns { public static void main(String[] args) { // Tạo ra một Factory cho các hình 2D bình thường AbstractFactory 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óc AbstractFactory 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.