Pattern-No.02 设计模式之享元模式

1)GoF对享元模式的描述是:运用共享技术有效地支持大量细粒度的对象。

    Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。

 

2)Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:

     1、 一个应用程序使用了大量的对象。

     2 、完全由于使用大量的对象,造成很大的存储开销。

     3 、对象的大多数状态都可以变为外部状态。

     4、如果删除对象以外的状态那么可以用相对较少的共享对象取代很多组对象。

     5、应用程序不依赖于对象标识。

比如说,一个咖啡店有几种口味的咖啡(拿铁、摩卡、卡布奇诺等等),如果这家店接到分订单要几十杯咖啡。那么显然咖啡的口味就可以设置成共享的,而不必为每一杯单独生成。代码实现如下:

package chapter05_flyWeightPattern;
 
public abstract class Order {
 
    //执行销售
    public abstract void sell();
}

package chapter05_flyWeightPattern;
 
import java.util.HashMap;
import java.util.Map;
 
public class FlavorFactory {
 
    private Map<String, Order> flavorPools = new HashMap<String, Order>();
 
    private static FlavorFactory flavorFactory;
 
    private FlavorFactory() {
 
    }
 
    public static FlavorFactory getInstance() {
        if(flavorFactory == null) {
            flavorFactory = new FlavorFactory();
        }
 
        return flavorFactory;
    }
 
    public Order getOrder(String flavor) {
        Order order = null;
        if(flavorPools.containsKey(flavor)) {
            order = flavorPools.get(flavor);
        } else {
            order = new FlavorOrder(flavor);
            flavorPools.put(flavor, order);
        }
 
        return order;
    }
 
    public int getObjCoffee() {
        return flavorPools.size();
    }
}

package chapter05_flyWeightPattern;
 
public class FlavorOrder extends Order {
 
    private String flavor;
 
    public FlavorOrder(String flavor) {
        this.flavor = flavor;
    }
 
    @Override
    public void sell() {
        System.out.println("卖出一份" + flavor + "的咖啡");
    }
 
}

package chapter05_flyWeightPattern;
 
import java.util.ArrayList;
import java.util.List;
 
public class Client {
 
    private static List<Order> orders = new ArrayList<Order>();
    private static FlavorFactory flavorFactory;
 
    private static void addOrder(String flavor) {
        orders.add(flavorFactory.getOrder(flavor));
    }
 
    public static void main(String[] args) {
        flavorFactory = FlavorFactory.getInstance();
 
        addOrder("摩卡");
        addOrder("卡布奇诺");
        addOrder("摩卡");
        addOrder("香草星冰乐");
        addOrder("卡布奇诺");
        addOrder("摩卡");
        addOrder("拿铁");
        addOrder("拿铁");
        addOrder("卡布奇诺");
        addOrder("香草星冰乐");
        addOrder("香草星冰乐");
        addOrder("拿铁");
        addOrder("拿铁");
 
        for(Order order : orders) {
            order.sell();
        }
 
        System.out.println("客户一共买了:" + orders.size() + "杯咖啡!");
        System.out.println("一共创建了:" + flavorFactory.getObjCoffee() + "个对象");
    }
}

你可能感兴趣的:(Pattern-No.02 设计模式之享元模式)