Рубрики

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

Шаблон Flyweight — это один из шаблонов структурного проектирования, так как этот шаблон обеспечивает способы уменьшения количества объектов, улучшая структуру требуемых объектов приложения. Шаблон Flyweight используется, когда нам нужно создать большое количество похожих объектов (скажем, 10 5 ). Одна важная особенность мухи — это то, что они неизменны . Это означает, что они не могут быть изменены после их создания.

Почему мы заботимся о количестве объектов в нашей программе?

  • Меньшее количество объектов уменьшает использование памяти, и это позволяет нам избежать ошибок, связанных с памятью, таких как java.lang.OutOfMemoryError.
  • Хотя создание объекта в Java действительно быстро, мы все же можем сократить время выполнения нашей программы, разделяя объекты.

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

Внутренние и внешние состояния

Чтобы понять внутреннее и внешнее состояние, давайте рассмотрим пример.

Предположим, что в текстовом редакторе при вводе символа создается объект класса Character, атрибуты класса Character — {name, font, size}. Нам не нужно создавать объект каждый раз, когда клиент вводит символ, поскольку буква «B» ничем не отличается от другой «B». Если клиент снова набирает 'B', мы просто возвращаем объект, который мы уже создали ранее. Теперь все это внутренние состояния (имя, шрифт, размер), так как они могут быть общими для разных объектов, так как они похожи друг на друга.

Теперь мы добавляем больше атрибутов к классу Character, это строки и столбцы. Они указывают положение символа в документе. Теперь эти атрибуты не будут похожи даже для одних и тех же символов, поскольку никакие два символа не будут иметь одинаковую позицию в документе, эти состояния называются внешними состояниями и не могут быть общими для объектов.

Реализация: В игре Counter Strike мы реализуем создание Террористов и Контртеррористов. Таким образом , у нас есть 2 класса один для T errorist (T) и другие для C ounter T errorist (CT). Всякий раз, когда игрок просит оружие, мы назначаем ему запрашиваемое оружие. В миссии задача террориста состоит в том, чтобы установить бомбу, в то время как контртеррористы должны распространить бомбу.

Зачем использовать Flyweight Design Pattern в этом примере? Здесь мы используем шаблон проектирования Fly Weight, так как здесь нам нужно уменьшить количество объектов для игроков. Теперь у нас есть n игроков, играющих в CS 1.6. Если мы не будем следовать шаблону проектирования Fly Weight, то нам нужно будет создать n объектов, по одному для каждого игрока. Но теперь нам нужно будет создать только 2 объекта, один для террористов, а другой для борьбы с террористами, и мы будем использовать их снова и снова, когда это потребуется.

Внутреннее состояние: здесь «задание» является внутренним состоянием для обоих типов игроков, поскольку оно всегда одинаково для Т / КТ. Мы можем иметь некоторые другие состояния, такие как их цвет или любые другие свойства, которые похожи для всех террористов / контртеррористов в их соответствующем классе террористов / контртеррористов.

Внешнее состояние: Оружие является внешним состоянием, поскольку каждый игрок может носить любое оружие по своему выбору. Оружие должно быть передано в качестве параметра самим клиентом.

Диаграмма классов:

// Java-программа для демонстрации работы
// Шаблон FlyWeight с примером Counter
// Забастовка

import java.util.Random;

import java.util.HashMap;

  
// Общий интерфейс для всех игроков

interface Player

{

    public void assignWeapon(String weapon);

    public void mission();

}

  
// У террористов должно быть оружие и миссия

class Terrorist implements Player

{

    // Внутренний атрибут

    private final String TASK;

  

    // Внешний атрибут

    private String weapon;

  

    public Terrorist()

    {

        TASK = "PLANT A BOMB";

    }

    public void assignWeapon(String weapon)

    {

        // Назначаем оружие

        this.weapon = weapon;

    }

    public void mission()

    {

        // Работа над миссией

        System.out.println("Terrorist with weapon "

                           + weapon + "|" + " Task is " + TASK);

    }

}

  
// Контртеррорист должен иметь оружие и миссию

class CounterTerrorist implements Player

{

    // Внутренний атрибут

    private final String TASK;

  

    // Внешний атрибут

    private String weapon;

  

    public CounterTerrorist()

    {

        TASK = "DIFFUSE BOMB";

    }

    public void assignWeapon(String weapon)

    {

        this.weapon = weapon;

    }

    public void mission()

    {

        System.out.println("Counter Terrorist with weapon "

                           + weapon + "|" + " Task is " + TASK);

    }

}

  
// Клаасс использовал для получения плеера, используя HashMap (Возвращает
// существующий игрок, если игрок данного типа существует.
// Остальное создает нового игрока и возвращает его.

class PlayerFactory

{

    / * HashMap хранит ссылку на объект

       террористического (TS) или контртеррористического (CT). * /

    private static HashMap <String, Player> hm =

                         new HashMap<String, Player>();

  

    // Способ получить игрока

    public static Player getPlayer(String type)

    {

        Player p = null;

  

        / * Если объект для TS или CT уже был

           создал просто вернуть его ссылку * /

        if (hm.containsKey(type))

                p = hm.get(type);

        else

        {

            / * создать объект TS / CT * /

            switch(type)

            {

            case "Terrorist":

                System.out.println("Terrorist Created");

                p = new Terrorist();

                break;

            case "CounterTerrorist":

                System.out.println("Counter Terrorist Created");

                p = new CounterTerrorist();

                break;

            default :

                System.out.println("Unreachable code!");

            }

  

            // После создания вставить его в HashMap

            hm.put(type, p);

        }

        return p;

    }

}

  
// Класс водителя

public class CounterStrike

{

    // Все типы игроков и weopons (используется getRandPlayerType ()

    // и getRandWeapon ()

    private static String[] playerType =

                    {"Terrorist", "CounterTerrorist"};

    private static String[] weapons =

      {"AK-47", "Maverick", "Gut Knife", "Desert Eagle"};

  

  

    // Код драйвера

    public static void main(String args[])

    {

        / * Предположим, что у нас всего 10 игроков

           в игре. * /

        for (int i = 0; i < 10; i++)

        {

            / * getPlayer () вызывается просто используя класс

               имя, поскольку метод является статическим * /

            Player p = PlayerFactory.getPlayer(getRandPlayerType());

  

            / * Назначить оружие, выбранное случайным образом, равномерно

               из массива оружия * /

            p.assignWeapon(getRandWeapon());

  

            // Отправить этого игрока на задание

            p.mission();

        }

    }

  

    // Служебные методы для получения случайного типа игрока и

    // оружие

    public static String getRandPlayerType()

    {

        Random r = new Random();

  

        // Вернем целое число между [0,2)

        int randInt = r.nextInt(playerType.length);

  

        // вернуть игрока, хранящегося в индексе 'randInt'

        return playerType[randInt];

    }

    public static String getRandWeapon()

    {

        Random r = new Random();

  

        // Вернем целое число от [0,5)

        int randInt = r.nextInt(weapons.length);

  

        // Возвращаем оружие, хранящееся в индексе 'randInt'

        return weapons[randInt];

    }

}

Выход:

 Контртеррорист создан
Контртеррорист с оружием Gut Нож | Задача - ДИФФУЗНАЯ БОМБА
Контртеррорист с оружием Desert Eagle | Задача - ДИФФУЗНАЯ БОМБА
Террорист создан
Террорист с оружием АК-47 | Задача ЗАВОДИТЬ БОМБУ
Террорист с оружием Gut Knife | Задача ЗАВОДИТЬ БОМБУ
Террорист с оружием Gut Knife | Задача ЗАВОДИТЬ БОМБУ
Террорист с оружием пустынный орел | Задача ЗАВОДИТЬ БОМБУ
Террорист с оружием АК-47 | Задача ЗАВОДИТЬ БОМБУ
Контртеррорист с оружием Desert Eagle | Задача - ДИФФУЗНАЯ БОМБА
Контртеррорист с оружием Gut Нож | Задача - ДИФФУЗНАЯ БОМБА
Контртеррорист с оружием Desert Eagle | Задача - ДИФФУЗНАЯ БОМБА 

Ссылки:

Эта статья предоставлена Чирагом Агарвалом . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

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

0.00 (0%) 0 votes