titans 2013-01-08
设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。
------------------------------------------------
享元模式(Flyweight)
运用共享技术有效地支持大量细粒度的对象。
适用于:
一个应用程序使用了大量的对象,完全由于使用大量的对象,造成很大的存储开销。
对象的大多数状态都可变为外部状态。
如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
程序实现:
下面的程序举个例子,把祝福短信存储在手机里面,在需要发送的时候只要后面加上名字就行了(不知是否恰当)。
抽象类:
//Flyweight public abstract class SMS { abstract public void sendMessage(String personName); }
实现类:
public class BirthdayMessage extends SMS{ @Override public void sendMessage(String personName){ System.out.println("Happy Birthday!"+personName+"!"); } }
public class SpringFestivalMessage extends SMS{ @Override public void sendMessage(String personName) { System.out.println("Happy Spring Festival!"+personName+"!"); } }
享元工厂:
//FlyweightFactory public class MessageFactory { private List<SMS> pool = new ArrayList<SMS>(); public MessageFactory(){ pool.add(new SpringFestivalMessage()); pool.add(new BirthdayMessage()); } //getFlyweight public SMS getMessage(String key){ if("SpringFestival".equalsIgnoreCase(key)){ return pool.get(0); }else{ return pool.get(1); } } }
客户端调用:
public static void main(String[] args){ MessageFactory mf = new MessageFactory(); SMS sms = mf.getMessage("SpringFestival"); sms.sendMessage("Tom"); sms.sendMessage("Jerry"); sms = mf.getMessage("Birthday"); sms.sendMessage("Tom"); sms.sendMessage("Jerry"); }
举例:棋类程序中的棋子,和输入法程序中的汉字,都可以认为使用享元模式实现。