Flyweight定义: 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
作者:中国IT实验室 来源:中国IT实验室 2007年8月26日
关键字:
¡¡Flyweight factory¸ºÔðά»¤Ò»¸öFlyweight³Ø(´æ·ÅÄÚ²¿×´Ì¬),µ±¿Í»§¶ËÇëÇóÒ»¸ö¹²ÏíFlyweightʱ,Õâ¸öfactoryÊ×ÏÈËÑË÷³ØÖÐÊÇ·ñÒѾÓпÉÊÊÓõÄ,Èç¹ûÓÐ,factoryÖ»ÊǼòµ¥·µ»ØËͳöÕâ¸ö¶ÔÏó,·ñÔò,´´½¨Ò»¸öеĶÔÏó,¼ÓÈëµ½³ØÖÐ,ÔÙ·µ»ØËͳöÕâ¸ö¶ÔÏó.³Ø
¡¡¡¡
¡¡¡¡public class FlyweightFactory {
¡¡¡¡¡¡¡¡//Flyweight pool
¡¡¡¡¡¡¡¡private Hashtable flyweights = new Hashtable();
¡¡¡¡
¡¡¡¡¡¡¡¡public Flyweight getFlyweight( Object key ) {
¡¡¡¡
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡Flyweight flyweight = (Flyweight) flyweights.get(key);
¡¡¡¡
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡if( flyweight == null ) {
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡//²úÉúеÄConcreteFlyweight
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡flyweight = new ConcreteFlyweight();
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡flyweights.put( key, flyweight );
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡return flyweight;
¡¡¡¡¡¡¡¡}
¡¡¡¡}¡¡
¡¡¡¡
¡¡¡¡ÖÁ´Ë,FlyweightģʽµÄ»ù±¾¿ò¼ÜÒѾ¾ÍÐ÷,ÎÒÃÇ¿´¿´ÈçºÎµ÷ÓÃ:
¡¡¡¡
¡¡¡¡FlyweightFactory factory = new FlyweightFactory();
¡¡¡¡Flyweight fly1 = factory.getFlyweight( "Fred" );
¡¡¡¡Flyweight fly2 = factory.getFlyweight( "Wilma" );
¡¡¡¡......
¡¡¡¡
¡¡¡¡´Óµ÷ÓÃÉÏ¿´,ºÃÏóÊǸö´¿´âµÄFactoryʹÓÃ,µ«°ÂÃî¾ÍÔÚÓÚFactoryµÄÄÚ²¿Éè¼ÆÉÏ.
¡¡¡¡
¡¡¡¡FlyweightģʽÔÚXMLµÈÊý¾ÝÔ´ÖÐÓ¦ÓÃ
¡¡¡¡ÎÒÃÇÉÏÃæÒѾÌáµ½,µ±´óÁ¿´ÓÊý¾ÝÔ´ÖжÁÈ¡×Ö·û´®,ÆäÖп϶¨ÓÐÖظ´µÄ,ÄÇôÎÒÃÇʹÓÃFlyweightģʽ¿ÉÒÔÌá¸ßЧÂÊ,ÒÔ³ªÆ¬CDΪÀý,ÔÚÒ»¸öXMLÎļþÖÐ,´æ·ÅÁ˶à¸öCDµÄ×ÊÁÏ.
¡¡¡¡
¡¡¡¡Ã¿¸öCDÓÐÈý¸ö×Ö¶Î:
¡¡¡¡1.³öƬÈÕÆÚ(year)
¡¡¡¡2.¸è³ªÕßÐÕÃûµÈÐÅÏ¢(artist)
¡¡¡¡3.³ªÆ¬ÇúÄ¿ (title)
¡¡¡¡
¡¡¡¡ÆäÖÐ,¸è³ªÕßÐÕÃûÓпÉÄÜÖظ´,Ò²¾ÍÊÇ˵,¿ÉÄÜÓÐͬһ¸öÑݳªÕߵĶà¸ö²»Í¬Ê±ÆÚ ²»Í¬ÇúÄ¿µÄCD.ÎÒÃǽ«"¸è³ªÕßÐÕÃû"×÷Ϊ¿É¹²ÏíµÄConcreteFlyweight.ÆäËûÁ½¸ö×Ö¶Î×÷ΪUnsharedConcreteFlyweight.
¡¡¡¡
¡¡¡¡Ê×ÏÈ¿´¿´Êý¾ÝÔ´XMLÎļþµÄÄÚÈÝ:
¡¡¡¡
¡¡¡¡<?xml version="1.0"?>
¡¡¡¡<collection>
¡¡¡¡
¡¡¡¡<cd>
¡¡¡¡<title>Another Green World</title>
¡¡¡¡<year>1978</year>
¡¡¡¡<artist>Eno, Brian</artist>
¡¡¡¡</cd>
¡¡¡¡
¡¡¡¡<cd>
¡¡¡¡<title>Greatest Hits</title>
¡¡¡¡<year>1950</year>
¡¡¡¡<artist>Holiday, Billie</artist>
¡¡¡¡</cd>
¡¡¡¡
¡¡¡¡
¡¡¡¡<cd>
¡¡¡¡<title>Taking Tiger Mountain (by strategy)</title>
¡¡¡¡<year>1977</year>
¡¡¡¡<artist>Eno, Brian</artist>
¡¡¡¡</cd>
¡¡¡¡
¡¡¡¡
¡¡¡¡.......
¡¡¡¡
¡¡¡¡</collection>