设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。
------------------------------------------------
享元模式(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");
}
举例:棋类程序中的棋子,和输入法程序中的汉字,都可以认为使用享元模式实现。