享元模式有问题
Having issue with flyweight pattern
当需要将特定种类的散装 object 装箱时,我们会使用享元。因为它们共享一个公共数据(内在状态),所以有助于减少内存消耗,并且还有它们自己的状态(外在状态),不会在所有其他 object 之间共享。这是一个示例代码
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);
}
}
和driver
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);
}
}
在这个例子中,我希望大小是内在的,坐标(x,y)是外在的,但是每当我改变 first_circle
的坐标时,它也会反映 second_circle
的变化,因为它们共享一个完整的 object 而不仅仅是一个状态。输出如下
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]
相当于创建一个 object 并将其存储在不同的 object 中,但它们都具有相同的状态或数据,那么它们如何拥有自己的数据(外部状态)?
享元对象应该是不可变的。
在您的示例中,您可以将重复使用的部分(color/size,您的示例冲突)放在单独的 class 中并将其用作享元。
然后您将为每个位置实例化一个新的 Circle,但重复使用颜色对象。
public class Color {
String color;
public (String color) {
this.color = color;
}
...
}
public abstract class Shape {
private Color color;
private int x;
private int y;
public Shape(Color color) {
super();
this.color = color;
}
...
}
public class Circle extends Shape {
public Circle(Color color) {
super(Color);
}
...
}
public class ShapeFactory {
private static HashMap<String, Color> color_map = new HashMap<>();
public static Shape getCircle(String color){
if(!color_map.containsKey(color))
color_map .put(color, new Color(color));
return new Circle(color_map.get(size));
}
}
当需要将特定种类的散装 object 装箱时,我们会使用享元。因为它们共享一个公共数据(内在状态),所以有助于减少内存消耗,并且还有它们自己的状态(外在状态),不会在所有其他 object 之间共享。这是一个示例代码
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);
}
}
和driver
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);
}
}
在这个例子中,我希望大小是内在的,坐标(x,y)是外在的,但是每当我改变 first_circle
的坐标时,它也会反映 second_circle
的变化,因为它们共享一个完整的 object 而不仅仅是一个状态。输出如下
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]
相当于创建一个 object 并将其存储在不同的 object 中,但它们都具有相同的状态或数据,那么它们如何拥有自己的数据(外部状态)?
享元对象应该是不可变的。
在您的示例中,您可以将重复使用的部分(color/size,您的示例冲突)放在单独的 class 中并将其用作享元。
然后您将为每个位置实例化一个新的 Circle,但重复使用颜色对象。
public class Color {
String color;
public (String color) {
this.color = color;
}
...
}
public abstract class Shape {
private Color color;
private int x;
private int y;
public Shape(Color color) {
super();
this.color = color;
}
...
}
public class Circle extends Shape {
public Circle(Color color) {
super(Color);
}
...
}
public class ShapeFactory {
private static HashMap<String, Color> color_map = new HashMap<>();
public static Shape getCircle(String color){
if(!color_map.containsKey(color))
color_map .put(color, new Color(color));
return new Circle(color_map.get(size));
}
}