设计模式回顾之十四:享元模式(Flyweight)

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");
}
 

举例:棋类程序中的棋子,和输入法程序中的汉字,都可以认为使用享元模式实现。

相关推荐