import java.util.HashMap; import java.util.Map; // Flyweight object interface interface CoffeeOrder { public void serveCoffee(CoffeeOrderContext context); } // ConcreteFlyweight object that creates ConcreteFlyweight class CoffeeFlavor implements CoffeeOrder { private final 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()); } } class CoffeeOrderContext { private final int tableNumber; public CoffeeOrderContext(int tableNumber) { this.tableNumber = tableNumber; } public int getTable() { return this.tableNumber; } } //FlyweightFactory object class CoffeeFlavorFactory { private Map<String, CoffeeFlavor> flavors = new HashMap<String, CoffeeFlavor>(); 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(); } } class TestFlyweight { /** The flavors ordered. */ private static CoffeeFlavor[] flavors = new CoffeeFlavor[100]; /** The tables for the orders. */ private static CoffeeOrderContext[] tables = new CoffeeOrderContext[100]; private static int ordersMade = 0; private static CoffeeFlavorFactory flavorFactory; public static void takeOrders(String flavorIn, int table) { flavors[ordersMade] = flavorFactory.getCoffeeFlavor(flavorIn); tables[ordersMade++] = 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[i].serveCoffee(tables[i]); } System.out.println(" "); System.out.println("total CoffeeFlavor objects made: " + flavorFactory.getTotalCoffeeFlavorsMade()); } }