Рубрики
Без рубрики

Шаблон дизайна Flyweight на Java

Шаблон дизайна Flyweight на Java. Пример исходного кода шаблона Flyweight. примеры шаблонов flyweight в JDK, диаграмма классов, шаблон проектирования строк.

Автор оригинала: Pankaj Kumar.

Сегодня мы рассмотрим шаблон дизайна Flyweight.

Схема Конструкции Летного Веса

Согласно GoF, шаблон дизайна flyweight намерение состоит в том, чтобы:

Используйте общий доступ для эффективной поддержки большого количества мелкозернистых объектов

Шаблон дизайна Flyweight – это Шаблон структурного дизайна как Шаблон фасада , Шаблон адаптера и Шаблон декоратора .

Шаблон дизайна Flyweight используется, когда нам нужно создать много объектов одного класса. Поскольку каждый объект потребляет пространство памяти, которое может иметь решающее значение для устройств с низким объемом памяти, таких как мобильные устройства или встроенные системы, шаблон проектирования с избыточным весом может быть применен для снижения нагрузки на память за счет совместного использования объектов.

Прежде чем мы применим шаблон проектирования летного веса, нам необходимо учитывать следующие факторы:

  • Количество объектов, создаваемых приложением, должно быть огромным.
  • Создание объекта требует большого объема памяти и также может занять много времени.
  • Свойства объекта можно разделить на внутренние и внешние свойства, внешние свойства объекта должны быть определены клиентской программой.

Чтобы применить шаблон flyweight, нам нужно разделить свойство объекта на внутренние и внешние свойства. Внутренние свойства делают объект уникальным, в то время как внешние свойства задаются клиентским кодом и используются для выполнения различных операций. Например, окружность объекта может иметь внешние свойства, такие как цвет и ширина.

Для применения шаблона flyweight нам нужно создать фабрику Flyweight , которая возвращает общие объекты. Для нашего примера предположим, что нам нужно создать рисунок с линиями и овалами. Таким образом, у нас будет интерфейс Форма и его конкретные реализации в виде Линии и Овала . Класс Oval будет обладать внутренним свойством для определения того, следует ли заполнять овал заданным цветом или нет, в то время как Линия не будет обладать каким-либо внутренним свойством.

Интерфейс шаблона дизайна Flyweight и конкретные классы

Интерфейс шаблона дизайна Flyweight и конкретные классы

package com.journaldev.design.flyweight;

import java.awt.Color;
import java.awt.Graphics;

public interface Shape {

	public void draw(Graphics g, int x, int y, int width, int height,
			Color color);
}

Интерфейс шаблона дизайна Flyweight и конкретные классы

package com.journaldev.design.flyweight;

import java.awt.Color;
import java.awt.Graphics;

public class Line implements Shape {

	public Line(){
		System.out.println("Creating Line object");
		//adding time delay
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void draw(Graphics line, int x1, int y1, int x2, int y2,
			Color color) {
		line.setColor(color);
		line.drawLine(x1, y1, x2, y2);
	}

}

Интерфейс шаблона дизайна Flyweight и конкретные классы

package com.journaldev.design.flyweight;

import java.awt.Color;
import java.awt.Graphics;

public class Oval implements Shape {
	
	//intrinsic property
	private boolean fill;
	
	public Oval(boolean f){
		this.fill=f;
		System.out.println("Creating Oval object with fill="+f);
		//adding time delay
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	@Override
	public void draw(Graphics circle, int x, int y, int width, int height,
			Color color) {
		circle.setColor(color);
		circle.drawOval(x, y, width, height);
		if(fill){
			circle.fillOval(x, y, width, height);
		}
	}

}

Обратите внимание, что я намеренно ввел задержку в создании объекта конкретных классов, чтобы подчеркнуть, что шаблон flyweight можно использовать для объектов, создание которых занимает много времени.

Фабрика по производству летучего груза

Фабрика flyweight будет использоваться клиентскими программами для создания экземпляра Объекта, поэтому нам нужно сохранить карту объектов на фабрике, которые не должны быть доступны клиентскому приложению.

Всякий раз, когда клиентская программа выполняет вызов для получения экземпляра объекта, он должен быть возвращен из хэш-карты, если он не найден, создайте новый объект и поместите его на карту, а затем верните его. Нам нужно убедиться, что при создании объекта учтены все его внутренние свойства.

Наш заводской класс flyweight выглядит следующим образом.

Наш заводской класс flyweight выглядит следующим образом.

package com.journaldev.design.flyweight;

import java.util.HashMap;

public class ShapeFactory {

	private static final HashMap shapes = new HashMap();

	public static Shape getShape(ShapeType type) {
		Shape shapeImpl = shapes.get(type);

		if (shapeImpl == null) {
			if (type.equals(ShapeType.OVAL_FILL)) {
				shapeImpl = new Oval(true);
			} else if (type.equals(ShapeType.OVAL_NOFILL)) {
				shapeImpl = new Oval(false);
			} else if (type.equals(ShapeType.LINE)) {
				shapeImpl = new Line();
			}
			shapes.put(type, shapeImpl);
		}
		return shapeImpl;
	}
	
	public static enum ShapeType{
		OVAL_FILL,OVAL_NOFILL,LINE;
	}
}

Обратите внимание на использование Перечисления Java для безопасности типов, Композиции Java (карта фигур) и Заводского шаблона в отличной форме методе.

Пример клиента Шаблона Дизайна Flyweight

Ниже приведен пример программы, которая использует реализацию шаблона flyweight.

Ниже приведен пример программы, которая использует реализацию шаблона flyweight.

package com.journaldev.design.flyweight;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.journaldev.design.flyweight.ShapeFactory.ShapeType;

public class DrawingClient extends JFrame{

	private static final long serialVersionUID = -1350200437285282550L;
	private final int WIDTH;
	private final int HEIGHT;

	private static final ShapeType shapes[] = { ShapeType.LINE, ShapeType.OVAL_FILL,ShapeType.OVAL_NOFILL };
	private static final Color colors[] = { Color.RED, Color.GREEN, Color.YELLOW };
	
	public DrawingClient(int width, int height){
		this.WIDTH=width;
		this.HEIGHT=height;
		Container contentPane = getContentPane();

		JButton startButton = new JButton("Draw");
		final JPanel panel = new JPanel();

		contentPane.add(panel, BorderLayout.CENTER);
		contentPane.add(startButton, BorderLayout.SOUTH);
		setSize(WIDTH, HEIGHT);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);

		startButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				Graphics g = panel.getGraphics();
				for (int i = 0; i < 20; ++i) {
					Shape shape = ShapeFactory.getShape(getRandomShape());
					shape.draw(g, getRandomX(), getRandomY(), getRandomWidth(),
							getRandomHeight(), getRandomColor());
				}
			}
		});
	}
	
	private ShapeType getRandomShape() {
		return shapes[(int) (Math.random() * shapes.length)];
	}

	private int getRandomX() {
		return (int) (Math.random() * WIDTH);
	}

	private int getRandomY() {
		return (int) (Math.random() * HEIGHT);
	}

	private int getRandomWidth() {
		return (int) (Math.random() * (WIDTH / 10));
	}

	private int getRandomHeight() {
		return (int) (Math.random() * (HEIGHT / 10));
	}

	private Color getRandomColor() {
		return colors[(int) (Math.random() * colors.length)];
	}

	public static void main(String[] args) {
		DrawingClient drawing = new DrawingClient(500,600);
	}
}

Я использовал генерацию случайных чисел для создания различных типов фигур в нашем фрейме.

Если вы запустите вышеуказанную клиентскую программу, вы заметите задержку в создании объектов первой строки и овальных объектов с заполнением как true, так и false. После этого программа выполняется быстро, так как она использует общие объекты.

После многократного нажатия кнопки “Нарисовать” рамка выглядит так, как показано на рисунке ниже.

И вы увидите следующий вывод в командной строке, подтверждающий, что объекты являются общими.

Creating Line object
Creating Oval object with fill=true
Creating Oval object with fill=false

Это все для шаблона flyweight, мы рассмотрим больше шаблонов дизайна в будущих сообщениях. Если вам понравилось, пожалуйста, поделитесь своими мыслями в разделе комментариев и поделитесь ими с другими.

Пример шаблона проектирования летного веса в JDK

Все классы оболочки valueOf() метод использует кэшированные объекты, показывающие использование шаблона проектирования Flyweight. Лучшим примером является Java

Все классы || оболочки |||| valueOf() || метод использует кэшированные объекты, показывающие использование шаблона проектирования Flyweight. Лучшим примером является || Java

  1. Все классы
  2. оболочки

Это все для шаблона проектирования Flyweight в java.