Mẫu thiết kế - Mẫu Flyweight
Flyweight pattern chủ yếu được sử dụng để giảm số lượng đối tượng được tạo và giảm dung lượng bộ nhớ cũng như tăng hiệu suất. Loại mẫu thiết kế này nằm dưới mẫu cấu trúc vì mẫu này cung cấp các cách để giảm số lượng đối tượng do đó cải thiện cấu trúc đối tượng của ứng dụng.
Flyweight pattern cố gắng sử dụng lại các đối tượng loại tương tự đã có bằng cách lưu trữ chúng và tạo đối tượng mới khi không tìm thấy đối tượng phù hợp. Chúng tôi sẽ chứng minh mô hình này bằng cách vẽ 20 vòng tròn ở các vị trí khác nhau nhưng chúng tôi sẽ chỉ tạo ra 5 đối tượng. Chỉ có 5 màu có sẵn nên thuộc tính màu được sử dụng để kiểm tra các đối tượng Vòng tròn đã có .
Thực hiện
Chúng ta sẽ tạo một giao diện Shape và lớp cụ thể Circle thực hiện giao diện Shape . Một lớp nhà máy ShapeFactory được xác định là bước tiếp theo.
ShapeFactory có HashMap of Circle có khóa là màu của đối tượng Circle . Bất cứ khi nào có yêu cầu tạo một vòng tròn có màu cụ thể cho ShapeFactory , nó sẽ kiểm tra đối tượng vòng tròn trong HashMap của nó , nếu đối tượng của Circle được tìm thấy, đối tượng đó sẽ được trả về nếu không một đối tượng mới được tạo, được lưu trữ trong bản đồ băm để sử dụng trong tương lai và trả về khách hàng.
FlyWeightPatternDemo , lớp demo của chúng tôi, sẽ sử dụng ShapeFactory để lấy đối tượng Shape . Nó sẽ chuyển thông tin ( đỏ / xanh lá cây / xanh dương / đen / trắng ) đến ShapeFactory để có được vòng tròn màu mong muốn mà nó cần.
Bước 1
Tạo giao diện.
Shape.java
public interface Shape {
void draw();
}
Bước 2
Tạo lớp cụ thể thực hiện cùng một giao diện.
Circle.java
public class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color){
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius);
}
}
Bước 3
Tạo một nhà máy để tạo đối tượng của lớp cụ thể dựa trên thông tin đã cho.
ShapeFactory.java
import java.util.HashMap;
public class ShapeFactory {
// Uncomment the compiler directive line and
// javac *.java will compile properly.
// @SuppressWarnings("unchecked")
private static final HashMap circleMap = new HashMap();
public static Shape getCircle(String color) {
Circle circle = (Circle)circleMap.get(color);
if(circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color : " + color);
}
return circle;
}
}
Bước 4
Sử dụng nhà máy để lấy đối tượng của lớp bê tông bằng cách chuyển một thông tin chẳng hạn như màu sắc.
FlyweightPatternDemo.java
public class FlyweightPatternDemo {
private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };
public static void main(String[] args) {
for(int i=0; i < 20; ++i) {
Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor());
circle.setX(getRandomX());
circle.setY(getRandomY());
circle.setRadius(100);
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int)(Math.random()*colors.length)];
}
private static int getRandomX() {
return (int)(Math.random()*100 );
}
private static int getRandomY() {
return (int)(Math.random()*100);
}
}
Bước 5
Xác minh kết quả đầu ra.
Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100