Шаблон FlyWeight Design выглядит не работает - PullRequest
0 голосов
/ 12 февраля 2020

У меня небольшая проблема с реализацией шаблона проектирования FlyWeight в Java 11.

У меня есть пример для рисования цветных прямоугольников, где свойство Intrinsi c - это цвет, а свойства Extrinsi c - это размеры прямоугольника. .

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

Вы можете посмотреть всю мою реализацию здесь:

https://github.com/zrebec/DesignPatterns/tree/master/DesignPatterns/src/sk/zrebec/learn/java/designpatterns/flyweight

У меня есть метод "classi c", когда я каждый раз создаю новый прямоугольник (закомментированный конструктор в методе MyRectangle и 2 строки в конструкторе программы и нескомментированный метод FlyWeight с использованием RectFactory

Я создал Factory

public class RectFactory {

    private static final HashMap<Color, MyRectangle> rectsByColor = new HashMap<Color, MyRectangle>();

    public static MyRectangle getRect(Color color) {

        MyRectangle rect = (MyRectangle)rectsByColor.get(color);

        if (rect == null) { 

            rect = new MyRectangle(color);
            rectsByColor.put(color, rect);
        }

        return rect;

    }

}

Тогда мой конструктор выглядит так:

public MyRectangle(Color color) {
        this.color = color;
    }

    public void draw(Graphics g, int upperX, int upperY, int lowerX, int lowerY) {
        g.setColor(color);
        g.fillRect(upperX, upperY, lowerX, lowerY);
    }
}

и реализация в Program. java выглядит так:

MyRectangle rect = RectFactory.getRect(getRandomColor());
rect.draw(g, getRandX(), getRandY(), getRandX(), getRandY());

Но у меня очень схожий результат с обоими методами.

На моем компьютере отрисовка 4000000 прямоугольников занимает около 7 секунд и с классом c мето d (без использования Factory) тоже

Метод FlyWeight

Первый результат:

Используемая память в байтах: 171 853 6 Это заняло 7392 миллисекунды

Второй результат:

Использованная память в байтах: 172 005 6 Это заняло 7047 миллисекунд

Класси c метод, когда экземпляр прямоугольника создается каждый раз

Первый результат:

Используемая память в байтах: 171 664 8 Это заняло 7489 миллисекунд

Второй результат:

Используемая память в байтах: 171 760 8 Это заняло 7178 миллисекунд

**

Шаблон проектирования FlyWeight должен составлять около 200 до 300% быстрее, не так ли?

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

Спасибо за любой совет

...