享元模式

来源:互联网 发布:mysql 需要.net吗 编辑:程序博客网 时间:2024/06/02 02:31

享元模式:

意图:运用共享技术有效的支持大量细粒度的对象。

享元模式可使共享的访问那些大量出现的细粒度对象,享元对象必须是不可变的,可将那些不变得部分提取出来

享元模式的重点:

分离变与不变,本质是分离与共享。把一个对象的状态分为内部状态和外部状态。内部状态是不变的,外部状态是可变的,通过共享不变的部分,达到减少对象数量并节约内存的目的。

内部状态:通常指的是包含在享元对象内部的、对象本身的状态,不会随享元环境而变化,因此可共享。

外部状态:是享元对象之外的状态,取决于使用享元的场景,会根据应用场景而变化,因此不可共享。若享元对象需要这些外部状态,可从外部传到外部状态中,外部状态和内部状态是相互独立的,外部状态的变化不会引起内部状态的变化。

享元模式结构图:

java设计模式之享元模式 - tzj163 - 老狼

抽象享元角色:所有具体享元类的父类,规定一些需要实现的公共接口。

具体享元角色:抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。

享元工厂角色:负责创建和管理享元角色,一般需要一个hashmap对象

public interface Order {
   public void sell();
}


public class FlavorOrder implements Order{
private String name;
public FlavorOrder(String name){
this.name = name;
}
@Override
public void sell() {
System.out.println("卖出一份"+name+"味儿的咖啡");
}
}


public class FlavorFactory {
   private Map<String, Order> flavorMap = new HashMap<String,Order>();
   
   private static FlavorFactory factory = null;
   
   public static FlavorFactory GetInstance(){
  if (factory == null) {
factory = new FlavorFactory();
}
  return factory;
   }
   
   public Order getOrder(String favor){
  Order order = null;
  if (flavorMap.containsKey(favor)) {
order =  flavorMap.get(favor);;
 } else {
order = new FlavorOrder(favor);
flavorMap.put(favor, order);
}
  return order;
   }
   
   public int getTotalFlavorMade(){
  return flavorMap.size();
   }
}


public class Test {

private static List<Order> orders = new ArrayList<Order>();
private static FlavorFactory factory = null;
    private static void takeOrders(String favor){
    orders.add(factory.getOrder(favor));
    }    
    
   public static void main(String[] args) {   
factory = FlavorFactory.GetInstance();
takeOrders("拿铁");
takeOrders("拿铁");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
takeOrders("卡布奇诺");
System.out.println("一共"+orders.size()+"单");
System.out.println("制作了"+factory.getTotalFlavorMade());
for (Order order:orders) {
order.sell();
}
}
}


0 0
原创粉丝点击