Flyweight Примеры в Java - PullRequest
       30

Flyweight Примеры в Java

6 голосов
/ 27 сентября 2011

Я пытаюсь создать легкий объект на Java.Я работал с подобной концепцией в Objective-C (Синглтон-классы в Objective-C // Я считаю, что это одно и то же).

Я пытаюсь найти учебное пособие или пример или объяснение в Интернете, чтобыУзнайте, как создать легкий объект и использовать его, но я искал в Google и не могу найти ничего спускаемого.Я просмотрел 10 страниц, и они в основном все плагиат с одного сайта, который просто объясняет концепцию.Я понимаю концепцию - мне нужно что-то, чтобы помочь мне / научить меня, как реализовать это в Java.

У кого-нибудь есть какие-либо предложения / учебные пособия?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 27 сентября 2011

Запись в Википедии для шаблона flyweight содержит конкретный пример Java.

ПРАВКА, чтобы попытаться помочь ОП понять шаблон:

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

Используя пример Wiki, CoffeeFlavorFactory будет толькосоздайте один экземпляр любого данного CoffeeFlavor (это делается при первом запросе Flavor).Последующие запросы на тот же вариант возвращают ссылку на оригинальный единственный экземпляр.

public static void main(String[] args) 
{
    flavorFactory = new CoffeeFlavorFactory();
    CoffeeFlavor a = flavorFactory.getCoffeeFlavor("espresso");
    CoffeeFlavor b = flavorFactory.getCoffeeFlavor("espresso");
    CoffeeFlavor c = flavorFactory.getCoffeeFlavor("espresso");

    // This is comparing the reference value, not the contents of the objects
    if (a == b && b == c)
        System.out.println("I have three references to the same object!");
}
1 голос
/ 27 сентября 2011

Я получил это дело. Я думаю, что мое решение было легким весом.

ВХОД

  • A: C E
  • B: D C
  • C: E
  • A: B

Он попросил меня создать дерево и отсортировать его детей по имени. Примерно так:

  • A: B C E
  • B: C D
  • C: E

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

public Node add(String key){
  Node node = nodes.get(key);
  if (null == node){
    node = new Node(key);
    nodes.put(key, node);
  }
  return node;
}

Это упрощенная версия реальной проблемы, но вы должны иметь представление сейчас.

1 голос
/ 27 сентября 2011

Чтобы продолжить работу над примером из Википедии, который цитировал Брайан ...

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

Если Заказы всегда создаются только одним синглтоном, например, CoffeeOrderFactory, тогдаФабрика может хранить нестатический кэш ароматов.Как бы вы этого ни делали, ваша цель - заставить все Ордена во всей системе использовать один и тот же точный набор объектов Flavor.Но в конце концов, если вы хотите избежать создания множества экземпляров CoffeeFlavor, то его обычно нужно создавать статически, просто чтобы убедиться, что есть только один кеш.

Получить?

0 голосов
/ 09 января 2014

«java.lang.Character» использует шаблон flyweight для кэширования всех символов US-ASCII: см. В классе java.lang.Character $ CharacterCache, используемый Character.valueOf () метод

0 голосов
/ 27 сентября 2011

Я также нашел этот пример, в котором есть хороший пример кода Java.

...