Factory là một trong những dạng thức triển khai được sử dụng nhiều nhất và được xếp vào nhóm các dạng thức Khởi Tạo.
Trong phép triển khai Factory, chúng ta tạo ra các object mà không để mở logic khởi tạo cho phía client (đoạn code gửi yêu cầu và sử dụng object được khởi tạo). Thêm vào đó, việc tham chiếu tới object được khởi tạo sẽ được thực hiện thông qua một interface (giao diện) chung thay vì sử dụng class cụ thể.
Áp dụng triển khai
- Chúng ta sẽ tạo ra
01 interfacechung có tên làShapecho cácclassmô tả hình 2D (hình tròn, tam giác, hình vuông) và cácclasscụ thể triển khaiinterfacenày. - Ở bước tiếp theo,
01 classcó tên làFactorysẽ được định nghĩa. - Cuối cùng là
maincủa chương trình sẽ sử dụngFactoryđể yêu cầu khởi tạo1 Shape(hình 2D).mainsẽ truyền vào thông tin về kiểuShapemuốn khởi tạo (circle/triangle/square– hình tròn / tam giác / hình vuông).

Về mặt quản lý code, chúng ta sẽ có 1 package được đặt tên là shapefactory. Package này sẽ chứa:
01 class Factorymởpublic01 interface Shapemởpublic03 classtriển khai đểdefault
Điều này có nghĩa là code client ở phía bên ngoài package sẽ hoàn toàn không biết tới 03 class triển khai Shape mà chỉ có thể gọi Factory để khởi tạo các Shape và tham chiếu tới các object được tạo ra thông qua interface.
Bước 1
Tạo 01 interface có tên là Shape mở public.
shapefactory/Shape.java
packageshapefactory;publicinterfaceShape{voiddraw();}
Bước 2
Tạo các class cụ thể triển khai interface với access modifier đặt default, không mở public.
shapefactory/Circle.java
packageshapefactory;classCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tròn.");}}
shapefactory/Triangle.java
packageshapefactory;classTriangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tam giác.");}}
shapefactory/Square.java
packageshapefactory;classSquareimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình vuông.");}}
Bước 3
Tạo 1 Factory để sản xuất các Object thực thể với thông tin được cung cấp từ code client.
shapefactory/Factory.java
packageshapefactory;publicclassFactory{publicShapecreateShape(String type){if(type ==null)returnnull;if(type.equalsIgnoreCase("circle"))returnnewCircle();if(type.equalsIgnoreCase("triangle"))returnnewTriangle();if(type.equalsIgnoreCase("square"))returnnewSquare();elsereturnnull;}}
Bước 4
Sử dụng Factory trong code client ở main để yêu cầu khởi tạo các Object bằng cách truyền vào thông tin về loại hình của Shape.
FactoryPatternDemo.java
importshapefactory.Factory;importshapefactory.Shape;publicclassFactoryPatternDemo{publicstaticvoidmain(String[] args){Factory shapeFactory =newFactory();// Yêu cầu khởi tạo một Object hình tròn và gọi draw() để vẽShape circle = shapeFactory.createShape("circle");
circle.draw();// Yêu cầu khởi tạo một Object hình tam giác và gọi draw() để vẽShape triangle = shapeFactory.createShape("triangle");
triangle.draw();// Yêu cầu khởi tạo một Object hình vuông và gọi draw() để vẽShape square = shapeFactory.createShape("square");
square.draw();}}
Bước 5
Kiểm chứng lại kết quả được in ra ở Console.
console
Một hình tròn.
Một hình tam giác.
Một hình vuông.
Nguồn: viblo.asia
