Flyweight Pattern - Example in Java

Example in Java

// Flyweight object interface public interface CoffeeOrder { public void serveCoffee(CoffeeOrderContext context); } // ConcreteFlyweight object that creates ConcreteFlyweight public class CoffeeFlavor implements CoffeeOrder { private String flavor; public CoffeeFlavor(String newFlavor) { this.flavor = newFlavor; } public String getFlavor { return this.flavor; } public void serveCoffee(CoffeeOrderContext context) { System.out.println("Serving Coffee flavor " + flavor + " to table number " + context.getTable); } } public class CoffeeOrderContext { private int tableNumber; public CoffeeOrderContext(int tableNumber) { this.tableNumber = tableNumber; } public int getTable { return this.tableNumber; } } import java.util.HashMap; import java.util.Map; //FlyweightFactory object public class CoffeeFlavorFactory { private Map flavors = new HashMap; public CoffeeFlavor getCoffeeFlavor(String flavorName) { CoffeeFlavor flavor = flavors.get(flavorName); if (flavor == null) { flavor = new CoffeeFlavor(flavorName); flavors.put(flavorName, flavor); } return flavor; } public int getTotalCoffeeFlavorsMade { return flavors.size; } } public class TestFlyweight { /** The flavors ordered. */ private static CoffeeFlavor flavors = new CoffeeFlavor; /** The tables for the orders. */ private static CoffeeOrderContext tables = new CoffeeOrderContext; private static int ordersMade = 0; private static CoffeeFlavorFactory flavorFactory; public static void takeOrders(String flavorIn, int table) { flavors = flavorFactory.getCoffeeFlavor(flavorIn); tables = new CoffeeOrderContext(table); } public static void main(String args) { flavorFactory = new CoffeeFlavorFactory; takeOrders("Cappuccino", 2); takeOrders("Cappuccino", 2); takeOrders("Frappe", 1); takeOrders("Frappe", 1); takeOrders("Xpresso", 1); takeOrders("Frappe", 897); takeOrders("Cappuccino", 97); takeOrders("Cappuccino", 97); takeOrders("Frappe", 3); takeOrders("Xpresso", 3); takeOrders("Cappuccino", 3); takeOrders("Xpresso", 96); takeOrders("Frappe", 552); takeOrders("Cappuccino", 121); takeOrders("Xpresso", 121); for (int i = 0; i < ordersMade; ++i) { flavors.serveCoffee(tables); } System.out.println(" "); System.out.println("total CoffeeFlavor objects made: " + flavorFactory.getTotalCoffeeFlavorsMade); } }

Read more about this topic:  Flyweight Pattern