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 interface
chung có tên làShape
cho cácclass
mô tả hình 2D (hình tròn, tam giác, hình vuông) và cácclass
cụ thể triển khaiinterface
này. - Ở bước tiếp theo,
01 class
có tên làFactory
sẽ được định nghĩa. - Cuối cùng là
main
của chương trình sẽ sử dụngFactory
để yêu cầu khởi tạo1 Shape
(hình 2D).main
sẽ truyền vào thông tin về kiểuShape
muố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 Factory
mởpublic
01 interface Shape
mởpublic
03 class
triể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
package shapefactory; public interface Shape { void draw();
}
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
package shapefactory; class Circle
implements Shape { @Override public void draw() { System.out.println("Một hình tròn."); }
}
shapefactory/Triangle.java
package shapefactory; class Triangle
implements Shape { @Override public void draw() { System.out.println("Một hình tam giác."); }
}
shapefactory/Square.java
package shapefactory; class Square
implements Shape { @Override public void draw() { 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
package shapefactory; public class Factory { public Shape createShape(String type) { if (type == null) return null; if (type.equalsIgnoreCase("circle")) return new Circle(); if (type.equalsIgnoreCase("triangle")) return new Triangle(); if (type.equalsIgnoreCase("square")) return new Square(); else return null; }
}
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
import shapefactory.Factory;
import shapefactory.Shape; public class FactoryPatternDemo { public static void main(String[] args) { Factory shapeFactory = new Factory(); // 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.