I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Pyłek - waga piórkowa (flyweight) - wzorzec projektowy - java

1. Cel:
Wzorzec Pyłek - waga piórkowa (flyweight) minimalizuje użycie pamięci przez udostępnianie danych obiektom o podobnym typie.
Wzorzec służący do optymalizacji, bardziej wydajne użyci pamięci, przez podobne obiekty (immutable).
Zapewniają dużą wydajność i ulepszone przetwarzanie w przypadku dużej liczby podobnych obiektów.
Wzorzec wykorzystuje współdzielenie identycznego komponentu obiektu.
Jest to wzorzec wzorców, używa m.in. wzorzec Fabryki (Factory).

2. Problem:
Chcemy aby obiekty tego samego typu były tworzone tylko raz.
Np. mamy pozycję w sklepie internetowym, i pozycji tego samego typu tworzonych jest mnóstwo,
nie chcemy za każdym razem każdą pozycję tworzyć od nowa.

3. Rozwiązanie:
Tworzymy obiekt tylko jeden raz, przy jego wywołaniu sprawdzamy czy go wcześniej nie zcacheowaliśmy.
Jeżeli jest scachowany bierzemy już wcześniej stworzony obiekt i zwracamy go wzorcem fabryki.

4. Diagram klas wzorca Pyłek - waga piórkowa (flyweight):


5. Implementacja:
Pozycja w naszym sklepie:
  1. public class Item {
  2.     private final String name;
  3.  
  4.     public Item(String name) {
  5.         this.name = name;
  6.     }
  7.  
  8.     @Override
  9.     public String toString() {
  10.         return "Item{" +
  11.                 "name='" + name + '\'' +
  12.                 '}';
  13.     }
  14. }
  15.  
ilość pozycji:
  1. public class Order {
  2.     private final int orderNumber;
  3.     private final Item item;
  4.  
  5.     public Order(int orderNumber, Item item) {
  6.         this.orderNumber = orderNumber;
  7.         this.item = item;
  8.     }
  9.  
  10.     public void processOrder() {
  11.         System.out.println("Pozycja:" + item + "ilość:" + orderNumber);
  12.     }
  13. }
  14.  
to jest główna funkcjonalość wzorca flyweight:
  1. public class Catalog {
  2.     private Map<String, Item> items = new HashMap<>();
  3.  
  4.     public Item lookup(String itemName) {
  5.         if (!items.containsKey(itemName)) {
  6.             items.put(itemName, new Item(itemName));
  7.         }
  8.         return items.get(itemName);
  9.     }
  10.  
  11.     public int totalItemsMade() {
  12.         return items.size();
  13.     }
  14. }
  15.  
To jest koszyk zamówień:
  1. public class InventorySystem {
  2.     private final Catalog catalog = new Catalog();
  3.     private final List<Order> orders = new CopyOnWriteArrayList<>();
  4.  
  5.     public void takeOrder(String itemName, int orderNumber) {
  6.         Item item = catalog.lookup(itemName);
  7.         Order order = new Order(orderNumber, item);
  8.         orders.add(order);
  9.     }
  10.  
  11.     public void process() {
  12.         for (Order order : orders) {
  13.             order.processOrder();
  14.         }
  15.     }
  16.  
  17.     public String report() {
  18.         return "Wszystkich obiektów: " + catalog.totalItemsMade();
  19.     }
  20. }
  21.  
Klasa testująca:
  1. public class FlyweightTest {
  2.     public static void main(String args[]) {
  3.         InventorySystem inventorySystem = new InventorySystem();
  4.  
  5.         inventorySystem.takeOrder("TV Samsung", 121);
  6.         inventorySystem.takeOrder("Lodówka Samsung", 399);
  7.         inventorySystem.takeOrder("Smartfon Motorola", 171);
  8.         inventorySystem.takeOrder("Aparat Nikon", 12);
  9.         inventorySystem.takeOrder("Słuchawki Bluetooth", 121);
  10.  
  11.         inventorySystem.takeOrder("TV Samsung", 134);
  12.         inventorySystem.takeOrder("Lodówka Samsung", 151);
  13.         inventorySystem.takeOrder("Smartfon Motorola", 34);
  14.         inventorySystem.takeOrder("Aparat Nikon", 85);
  15.         inventorySystem.takeOrder("Słuchawki Bluetooth", 1296);
  16.  
  17.         inventorySystem.takeOrder("TV Samsung", 3401);
  18.         inventorySystem.takeOrder("Lodówka Samsung", 13);
  19.         inventorySystem.takeOrder("Smartfon Motorola", 454);
  20.         inventorySystem.takeOrder("Aparat Nikon", 442);
  21.         inventorySystem.takeOrder("Słuchawki Bluetooth", 921);
  22.  
  23.         inventorySystem.process();
  24.  
  25.         System.out.println(inventorySystem.report());
  26.                 // Wszystkich obiektów: 5
  27.     }
  28. }
  29.  
6. Zastosowanie w kodzie java:
- java.lang.Integer#valueOf(int) (również String, Boolean, Byte, Character, Short, Long and BigDecimal)
created by cv.java.org.pl © 2023 All Rights Reserved.