设计模式之flyweight模式(带例子),这一篇文章讲解的比较透彻,发现网上其它的讲的都太抽象了。

java设计模式_享元模式(带例子)
2010-12-16 15:09

   Flyweight模式(享元)
   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,

将使自己对java中的接口或抽象类应用有更深的理解.

设计模式在java的中型系统中应用广泛,遵循一定的编程模式,

才能使自己的代码便于理解,易于交流,Flyweight(享元模式)

模式是比较常用的一个模式。


   Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:

比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,

那么我们可以将这些字符串储存在Flyweight池(pool)中.   

 设计初衷:面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大

,比如,字处理软件,

如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",

找出这些对象群的共同点,设计一个元类,封装可以被共享的类,

另外,还有一些特性是取决于应用(context),是不可共享的.  


  在此 以咖啡外卖店为例写了4个java类来描述说明Flyweight设计模式的实现方式;
   客户买咖啡下订单,订单只区分咖啡口味,如果下了1W个订单,而咖啡店只卖20种口味的咖啡,

那么我们就没有必要生成1W个订单对象,通过享元模式我们只需要生成20个订单对象。   

 1、 Order.java         订单抽象类
 2、 FlavorOrder.java   订单实现类
 3、 FlavorFactory.java 订单生成工厂
 4、 Client.java        客户类、带有main方法的测试类

===============   1、 Order.java

package flyweight;

public abstract class Order {
	public abstract void sell();
	public abstract String getFavor();
}


===============   2、 FlavorOrder.java

package flyweight;

public class FlavorOrder extends Order {
	private String flavor;
	public FlavorOrder(String flavor) {
		this.flavor = flavor;
	}
	@Override
	public void sell() {
		System.out.println("卖出一杯: " + this.flavor);
	}

	@Override
	public String getFavor() {
		return this.flavor;
	}

}


===============   3、 FlavorFactory.java

package flyweight;

import java.util.HashMap;
import java.util.Map;

public class FlavorFactory {
	private Map<String, Order> flavorPool = new HashMap<String, Order>();
	private static FlavorFactory flavorFactory = new FlavorFactory();
	public static FlavorFactory getInstance() {
		return flavorFactory;
	}
	
	public Order getOrder(String flavor) {
		Order order = null;
		if(flavorPool.containsKey(flavor)){
			order = flavorPool.get(flavor);
		} else {
			order = new FlavorOrder(flavor);
			flavorPool.put(flavor, order);
			
		}
		return order;
		
	}
	
	public int getTotalFlavorsMade() {
		return flavorPool.size();
	}
}


===============   4、 Client.java

package flyweight;

import java.util.ArrayList;
import java.util.List;

public class Client {
	private static List<Order> orders = new ArrayList<Order>(100);
	private static FlavorFactory flavorFactory;
	
	//增加订单
	public static void takeOrders(String flavor) {
		orders.add(flavorFactory.getOrder(flavor));
	}
	
	public static void main(String[] args) {
		flavorFactory = new FlavorFactory().getInstance();
		
		//增加订单
		takeOrders("摩卡");
	    takeOrders("卡布奇诺");
	    takeOrders("香草星冰乐");
	    takeOrders("香草星冰乐");
	    takeOrders("拿铁");
	    takeOrders("卡布奇诺");
	    takeOrders("拿铁");
	    takeOrders("卡布奇诺");
	    takeOrders("摩卡");
	    takeOrders("香草星冰乐");
	    takeOrders("卡布奇诺");
	    takeOrders("摩卡");
	    takeOrders("香草星冰乐");
	    takeOrders("拿铁");
	    takeOrders("拿铁");
	    
	    for(Order order : orders) {
	    	order.sell();
	    }
	    //打印生成的订单数量
	    System.out.println("\n客户一共买了 " +  orders.size() + " 杯咖啡! ");

	    //打印生成的订单java对象数量
	    System.out.println("\n共生成了 " +  
	    		flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象! ");
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值