2015-05-24 3 views
3

Вот учебник я читал:Является ли этот мультяшный рисунок действительно мухомором?

http://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm

Вот код, я думаю, что это не шаблон мухи, как указано:

public interface Shape { 
    void draw(); 
} 

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

import java.util.HashMap; 

public class ShapeFactory { 
    private static final HashMap<String, Shape> 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; 
    } 
} 

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

Это не кажется мне образец мухи, потому что в соответствии с wikipedia «Мухи - это объект, который минимизирует использование памяти путем совместного использования как можно большего количества данных с другими подобными объектами». Другими словами, я не вижу объект с внутренними и внешними данными. Здесь я могу увидеть только фабрику с какой-то системой кеширования.

Может кто-нибудь продемонстрировать, почему это или нет мухи?

+3

Пожалуйста, разместите соответствующий код в своем вопросе, а не ссылку на него. –

+0

добавил соответствующий код. – user1883212

+0

Я думаю, что если цвет был другим классом, а на заводе были кеширование цветов вместо фигур, то это было бы мухи. – user1883212

ответ

2

Когда вы создаете новый круг через ShapeFactory, возвращается уже созданный экземпляр, если он существует для нужного цвета. Таким образом вы можете повторно использовать созданные вами экземпляры Circle (они «делят» свои данные с кругами одного цвета) и минимизируют потребление памяти.

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

И это совершенно небезопасно.

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