结构型模式之六:享元模式

享元模式用来减少内存使用,他所做的是尽可能的与其他类似的对象共享更多的数据。 

1、享元模式的类图

结构型模式之六:享元模式

 2、享元模式的Java代码

// Flyweight object interface
interface ICoffee {
  public void serveCoffee(CoffeeContext context);
}
// Concrete Flyweight object  
class Coffee implements ICoffee {
  private final String flavor;
 
  public Coffee(String newFlavor) {
    this.flavor = newFlavor;
    System.out.println("Coffee is created! - " + flavor);
  }
 
  public String getFlavor() {
    return this.flavor;
  }
 
  public void serveCoffee(CoffeeContext context) {
    System.out.println("Serving " + flavor + " to table " + context.getTable());
  }
}
// A context, here is table number
class CoffeeContext {
  private final int tableNumber;
 
  public CoffeeContext(int tableNumber) {
    this.tableNumber = tableNumber;
  }
 
  public int getTable() {
    return this.tableNumber;
  }
}

咖啡工厂,他只在需要的时候创建新咖啡

//The FlyweightFactory!
class CoffeeFactory {
  private HashMap flavors = new HashMap();
 
  public Coffee getCoffeeFlavor(String flavorName) {
    Coffee flavor = flavors.get(flavorName);
    if (flavor == null) {
      flavor = new Coffee(flavorName);
      flavors.put(flavorName, flavor);
    }
    return flavor;
  }
 
  public int getTotalCoffeeFlavorsMade() {
    return flavors.size();
  }
}
public class Waitress {
  //coffee array
  private static Coffee[] coffees = new Coffee[20];
  //table array
  private static CoffeeContext[] tables = new CoffeeContext[20];
  private static int ordersCount = 0;
  private static CoffeeFactory coffeeFactory;
 
  public static void takeOrder(String flavorIn, int table) {
    coffees[ordersCount] = coffeeFactory.getCoffeeFlavor(flavorIn);
    tables[ordersCount] = new CoffeeContext(table);
    ordersCount++;
  }
 
  public static void main(String[] args) {
    coffeeFactory = new CoffeeFactory();
 
    takeOrder("Cappuccino", 2);
    takeOrder("Cappuccino", 2);
    takeOrder("Regular Coffee", 1);
    takeOrder("Regular Coffee", 2);
    takeOrder("Regular Coffee", 3);
    takeOrder("Regular Coffee", 4);
    takeOrder("Cappuccino", 4);
    takeOrder("Cappuccino", 5);
    takeOrder("Regular Coffee", 3);
    takeOrder("Cappuccino", 3);
 
    for (int i = 0; i < ordersCount; ++i) {
      coffees[i].serveCoffee(tables[i]);
    }
 
    System.out.println("\nTotal Coffee objects made: " +  coffeeFactory.getTotalCoffeeFlavorsMade());
  }
}

检查下面的输出 ,咖啡被10台服务,但是只有两台被使用

Coffee is created! - Cappuccino
Coffee is created! - Regular Coffee
Serving Cappuccino to table 2
Serving Cappuccino to table 2
Serving Regular Coffee to table 1
Serving Regular Coffee to table 2
Serving Regular Coffee to table 3
Serving Regular Coffee to table 4
Serving Cappuccino to table 4
Serving Cappuccino to table 5
Serving Regular Coffee to table 3
Serving Cappuccino to table 3

Total Coffee objects made: 2

以上文章翻译自: http://www.programcreek.com/2013/02/java-design-pattern-flyweight/

你可能感兴趣的:(结构型模式之六:享元模式)