2016-05-04 2 views
0

Мы используем мухи, когда необходимо заполнить массив определенного типа объектов. Поскольку они имеют общие данные (внутреннее состояние), это помогает сократить потребление памяти, а также имеет собственное состояние (внешнее состояние), которое не используется совместно со всем другим объектом. Вот пример кодВыдача с мухомодным рисунком

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] 

эквивалента создать объект и сохранить его в различных объектах, но все они имеют одинаковое состояние или данные, то, как у них есть свои собственные данные (внешнее состояние)?

+0

Просьба указать код вашего ShapeFactory. –

+1

Вы уверены, что мухи подходят для этого? Вы хотите создать множество объектов «круг» с различным состоянием (т. Е. Координатами). Flyweight будет только иметь возможность применить к совместно используемому (то есть цвету) - вам все равно придется иметь отдельные экземпляры «формы», чтобы связать объект flyweight с изменяемым состоянием. – sisyphus

+0

Спасибо @sisyphus, я понял, что я ошибся в мухи. Цвет - это общее состояние, тогда мухи должны хранить только «цвет» и каждый раз, когда будет создан новый объект «круг» с тем же цветом, что и @ Glenner003. – user464

ответ

2

Объекты мухи должны быть неизменными.

В вашем примере вы можете отчаянно отказаться от использования повторно используемой части (цвет/размер, конфликт ваших примеров) в отдельном классе и использовать это как мухи.

Затем вы создадите новый круг для каждого местоположения, но повторно используйте цветной объект.

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)); 
     } 

    } 
+0

Можете ли вы ссылаться на источник для утверждения, «_Полимерные объекты должны быть неизменными»? Я с тобой согласен; но мне любопытно, это то, что вы читали, или просто мнение. – jaco0646

+0

Спасибо @ Glenner003, теперь я понимаю, что flyweight должен иметь дело только с (хранилищем) общим объектом, который в нашем случае является 'color', и каждый раз должен создать новый объект' circle' с общим объектом 'color'. Я следовал примеру [this] (http://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm), можете ли вы взглянуть на это? Тогда я думаю, что это неправильно. – user464

+0

@ jaco0646 Я, наверное, когда-то читал его где-то, но я не помню, где. Однако Wikipedia подтверждает это: https://en.wikipedia.org/wiki/Flyweight_pattern#Immutability_and_equality – Glenner003

Смежные вопросы