Мы используем мухи, когда необходимо заполнить массив определенного типа объектов. Поскольку они имеют общие данные (внутреннее состояние), это помогает сократить потребление памяти, а также имеет собственное состояние (внешнее состояние), которое не используется совместно со всем другим объектом. Вот пример кодВыдача с мухомодным рисунком
public abstract class Shape {
private String color;
private int x;
private int y;
public Shape(String color) {
super();
this.color = color;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public abstract String draw();
@Override
public String toString() {
return "[color=" + color + ", x=" + x + ", y=" + y + "]";
}
}
public class Circle extends Shape {
public Circle(String color) {
super(color);
}
@Override
public String draw() {
// TODO Auto-generated method stub
return "Circle " + toString();
}
}
import java.util.HashMap;
public class ShapeFactory {
private static HashMap<String, Shape> circle_map = new HashMap<>();
public static Shape getCircle(String size){
if(!circle_map.containsKey(size))
circle_map.put(size, new Circle(size));
return circle_map.get(size);
}
}
и водитель
public class ShapeDriver {
public static void main(String[] args) {
Shape first_circle = ShapeFactory.getCircle("small");
first_circle.setX(45);
first_circle.setY(12);
Shape second_circle = ShapeFactory.getCircle("small");
System.out.println("First circle" + first_circle);
System.out.println("Second circle" + second_circle);
second_circle.setX(62);
second_circle.setY(23);
System.out.println("First circle" + first_circle);
System.out.println("Second circle" + second_circle);
}
}
В этом примере я хочу размера, чтобы быть внутренним и координаты (х, у), чтобы быть внешними, но когда-либо я изменить координаты first_circle
он также отражает изменение в second_circle
, потому что они делят полный объект не только на одно состояние. Выход, как следовать
First circle[color=small, x=45, y=12]
Second circle[color=small, x=45, y=12]
First circle[color=small, x=62, y=23]
Second circle[color=small, x=62, y=23]
эквивалента создать объект и сохранить его в различных объектах, но все они имеют одинаковое состояние или данные, то, как у них есть свои собственные данные (внешнее состояние)?
Просьба указать код вашего ShapeFactory. –
Вы уверены, что мухи подходят для этого? Вы хотите создать множество объектов «круг» с различным состоянием (т. Е. Координатами). Flyweight будет только иметь возможность применить к совместно используемому (то есть цвету) - вам все равно придется иметь отдельные экземпляры «формы», чтобы связать объект flyweight с изменяемым состоянием. – sisyphus
Спасибо @sisyphus, я понял, что я ошибся в мухи. Цвет - это общее состояние, тогда мухи должны хранить только «цвет» и каждый раз, когда будет создан новый объект «круг» с тем же цветом, что и @ Glenner003. – user464