ÕªÒª£ºÃæÏò¶ÔÏóµÄ˼ÏëºÜºÃµØ½â¾öÁ˳éÏóÐÔµÄÎÊÌ⣬һ°ãÒ²²»»á³öÏÖÐÔÄÜÉϵÄÎÊÌâ¡£µ«ÊÇÔÚijЩÇé¿öÏ£¬¶ÔÏóµÄÊýÁ¿¿ÉÄÜ»áÌ«¶à£¬´Ó¶øµ¼ÖÂÁËÔËÐÐʱµÄ´ú¼Û¡£ÄÇôÎÒÃÇÈçºÎÈ¥±ÜÃâ´óÁ¿Ï¸Á£¶ÈµÄ¶ÔÏó£¬Í¬Ê±ÓÖ²»Ó°Ïì¿Í»§³ÌÐòʹÓÃÃæÏò¶ÔÏóµÄ·½Ê½½øÐвÙ×÷£¿
±¾ÎÄÊÔͼͨ¹ýÒ»¸ö¼òµ¥µÄ×Ö·û´¦ÀíµÄÀý×Ó£¬ÔËÓÃÖØ¹¹µÄÊֶΣ¬Ò»²½²½´øÄã×ß½øFlyweightģʽ£¬ÔÚÕâ¸ö¹ý³ÌÖÐÎÒÃÇһͬ˼¿¼¡¢Ì½Ë÷¡¢È¨ºâ£¬Í¨¹ý±È½Ï¶øµÃ³öºÃµÄʵÏÖ·½Ê½£¬¶ø²»ÊǸøÄã×îÖÕµÄÒ»¸öÍêÃÀ½â¾ö·½°¸¡£
¸ÅÊö
ÃæÏò¶ÔÏóµÄ˼ÏëºÜºÃµØ½â¾öÁ˳éÏóÐÔµÄÎÊÌ⣬һ°ãÒ²²»»á³öÏÖÐÔÄÜÉϵÄÎÊÌâ¡£µ«ÊÇÔÚijЩÇé¿öÏ£¬¶ÔÏóµÄÊýÁ¿¿ÉÄÜ»áÌ«¶à£¬´Ó¶øµ¼ÖÂÁËÔËÐÐʱµÄ´ú¼Û¡£ÄÇôÎÒÃÇÈçºÎÈ¥±ÜÃâ´óÁ¿Ï¸Á£¶ÈµÄ¶ÔÏó£¬Í¬Ê±ÓÖ²»Ó°Ïì¿Í»§³ÌÐòʹÓÃÃæÏò¶ÔÏóµÄ·½Ê½½øÐвÙ×÷£¿
Òâͼ
ÔËÓù²Ïí¼¼ÊõÓÐЧµØÖ§³Ö´óÁ¿Ï¸Á£¶ÈµÄ¶ÔÏó¡£[GOF ¡¶Éè¼ÆÄ£Ê½¡·]
½á¹¹Í¼

ͼ1 Flyweightģʽ½á¹¹Í¼
Éú»îÖеÄÀý×Ó
ÏíԪģʽʹÓù²Ïí¼¼ÊõÓÐЧµØÖ§³Ö´óÁ¿Ï¸Á£¶ÈµÄ¶ÔÏó¡£¹«¹²½»»»µç»°Íø£¨PSTN£©ÊÇÏíÔªµÄÒ»¸öÀý×Ó¡£ÓÐһЩ×ÊÔ´ÀýÈ粦ºÅÒô·¢ÉúÆ÷¡¢ÕñÁå·¢ÉúÆ÷ºÍ²¦ºÅ½ÓÊÕÆ÷ÊDZØÐëÓÉËùÓÐÓû§¹²ÏíµÄ¡£µ±Ò»¸öÓû§ÄÃÆðÌýͲ´òµç»°Ê±£¬Ëû²»ÐèÒªÖªµÀʹÓÃÁ˶àÉÙ×ÊÔ´¡£¶ÔÓÚÓû§¶øÑÔËùÓеÄÊÂÇé¾ÍÊÇÓв¦ºÅÒô£¬²¦´òºÅÂ룬²¦Í¨µç»°¡£

ͼ2 ʹÓò¦ºÅÒô·¢ÉúÆ÷Àý×ÓµÄÏíԪģʽ¶ÔÏóͼ
Flyweightģʽ½â˵
FlyweightÔÚÈ»÷±ÈÈüÖÐÖ¸×îÇáÁ¿¼¶£¬¼´¡°Ó¬Á¿¼¶¡±£¬ÕâÀï·ÒëΪ¡°ÏíÔª¡±£¬¿ÉÒÔÀí½âΪ¹²ÏíÔª¶ÔÏó£¨Ï¸Á£¶È¶ÔÏ󣩵ÄÒâ˼¡£Ìáµ½Flyweightģʽ¶¼»áÒ»°ã¶¼»áÓÃ±à¼Æ÷Àý×ÓÀ´ËµÃ÷£¬ÕâÀïÒ²²»ÀýÍ⣬µ«Îһ᳢ÊÔ×Åͨ¹ýÖØ¹¹À´¿´´ýFlyweightģʽ¡£¿¼ÂÇÕâÑùÒ»¸ö×Ö´¦ÀíÈí¼þ£¬ËüÐèÒª´¦ÀíµÄ¶ÔÏó¿ÉÄÜÓе¥¸öµÄ×Ö·û£¬ÓÉ×Ö·û×é³ÉµÄ¶ÎÂäÒÔ¼°ÕûƪÎĵµ£¬¸ù¾ÝÃæÏò¶ÔÏóµÄÉè¼ÆË¼ÏëºÍCompositeģʽ£¬²»¹ÜÊÇ×Ö·û»¹ÊǶÎÂ䣬Îĵµ¶¼Ó¦¸Ã×÷Ϊµ¥¸öµÄ¶ÔÏóÈ¥¿´´ý£¬ÕâÀïÖ»¿¼Âǵ¥¸öµÄ×Ö·û£¬²»¿¼ÂǶÎÂä¼°ÎĵµµÈ¶ÔÏó£¬ÓÚÊÇ¿ÉÒÔºÜÈÝÒ׵ĵõ½ÏÂÃæµÄ½á¹¹Í¼£º

ͼ3
ʾÒâÐÔʵÏÖ´úÂ룺
public abstract class Charactor { //Fields protected char _symbol;
protected int _width;
protected int _height;
protected int _ascent;
protected int _descent;
protected int _pointSize;
//Method
public abstract void Display();
}
// "CharactorA"
public class CharactorA : Charactor
{
// Constructor
public CharactorA()
{
this._symbol = 'A';
this._height = 100;
this._width = 120;
this._ascent = 70;
this._descent = 0;
this._pointSize = 12;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
}
// "CharactorB"
public class CharactorB : Charactor
{
// Constructor
public CharactorB()
{
this._symbol = 'B';
this._height = 100;
this._width = 140;
this._ascent = 72;
this._descent = 0;
this._pointSize = 10;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
}
// "CharactorC"
public class CharactorC : Charactor
{
// Constructor
public CharactorC()
{
this._symbol = 'C';
this._height = 100;
this._width = 160;
this._ascent = 74;
this._descent = 0;
this._pointSize = 14;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
} |
ºÃÁË£¬ÏÖÔÚ¿´µ½µÄÕâ¶Î´úÂë¿ÉÒÔ˵ÊǺܺõطûºÏÁËÃæÏò¶ÔÏóµÄ˼Ï룬µ«ÊÇͬʱÎÒÃÇҲΪ´Ë¸¶³öÁ˳ÁÖØµÄ´ú¼Û£¬ÄǾÍÊÇÐÔÄÜÉϵĿªÏú£¬¿ÉÒÔÏëÏó£¬ÔÚһƪÎĵµÖУ¬×Ö·ûµÄÊýÁ¿Ô¶²»Ö¹¼¸°Ù¸öÕâô¼òµ¥£¬¿ÉÄÜÉÏǧÉÏÍò£¬ÄÚ´æÖоÍͬʱ´æÔÚÁËÉÏǧÉÏÍò¸öCharactor¶ÔÏó£¬ÕâÑùµÄÄڴ濪ÏúÊÇ¿ÉÏë¶øÖªµÄ¡£½øÒ»²½·ÖÎö¿ÉÒÔ·¢ÏÖ£¬ËäÈ»ÎÒÃÇÐèÒªµÄCharactorʵÀý·Ç³£¶à£¬ÕâЩʵÀýÖ®¼äÖ»²»¹ýÊÇ״̬²»Í¬¶øÒÑ£¬Ò²¾ÍÊÇ˵ÕâЩʵÀýµÄ״̬ÊýÁ¿ÊǺÜÉٵġ£ËùÒÔÎÒÃDz¢²»ÐèÒªÕâô¶àµÄ¶ÀÁ¢µÄCharactorʵÀý£¬¶øÖ»ÐèҪΪÿһÖÖCharactor״̬´´½¨Ò»¸öʵÀý£¬ÈÃÕû¸ö×Ö·û´¦ÀíÈí¼þ¹²ÏíÕâЩʵÀý¾Í¿ÉÒÔÁË¡£¿´ÕâÑùÒ»·ùʾÒâͼ£º

ͼ4
ÏÖÔÚÎÒÃÇ¿´µ½µÄA£¬B£¬CÈý¸ö×Ö·ûÊǹ²ÏíµÄ£¬Ò²¾ÍÊÇ˵Èç¹ûÎĵµÖÐÈκεط½ÐèÒªÕâÈý¸ö×Ö·û£¬Ö»ÐèҪʹÓù²ÏíµÄÕâÈý¸öʵÀý¾Í¿ÉÒÔÁË¡£È»¶øÎÒÃÇ·¢ÏÖµ¥´¿µÄÕâÑù¹²ÏíÒ²ÊÇÓÐÎÊÌâµÄ¡£ËäÈ»ÎĵµÖеÄÓõ½Á˺ܶàµÄA×Ö·û£¬ËäÈ»×Ö·ûµÄsymbolµÈÊÇÏàͬµÄ£¬Ëü¿ÉÒÔ¹²Ïí£»µ«ÊÇËüÃǵÄpointSizeÈ´ÊDz»ÏàͬµÄ£¬¼´×Ö·ûÔÚÎĵµÖÐÖеĴóСÊDz»ÏàͬµÄ£¬Õâ¸ö״̬²»¿ÉÒÔ¹²Ïí¡£Îª½â¾öÕâ¸öÎÊÌ⣬Ê×ÏÈÎÒÃǽ«²»¿É¹²ÏíµÄ״̬´ÓÀàÀïÃæÌÞ³ý³öÈ¥£¬¼´È¥µôpointSizeÕâ¸ö״̬£¨Ö»ÊÇÔÝʱµÄJ£©£¬Àà½á¹¹Í¼ÈçÏÂËùʾ£º

ͼ5
ʾÒâÐÔʵÏÖ´úÂ룺
public abstract class Charactor { //Fields protected char _symbol;
protected int _width;
protected int _height;
protected int _ascent;
protected int _descent;
//Method
public abstract void Display();
}
// "CharactorA"
public class CharactorA : Charactor
{
// Constructor
public CharactorA()
{
this._symbol = 'A';
this._height = 100;
this._width = 120;
this._ascent = 70;
this._descent = 0;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
}
// "CharactorB"
public class CharactorB : Charactor
{
// Constructor
public CharactorB()
{
this._symbol = 'B';
this._height = 100;
this._width = 140;
this._ascent = 72;
this._descent = 0;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
}
// "CharactorC"
public class CharactorC : Charactor
{
// Constructor
public CharactorC()
{
this._symbol = 'C';
this._height = 100;
this._width = 160;
this._ascent = 74;
this._descent = 0;
}
//Method
public override void Display()
{
Console.WriteLine(this._symbol);
}
} |
ºÃ£¬ÏÖÔÚÀàÀïÃæÊ£ÏµÄ״̬¶¼¿ÉÒÔ¹²ÏíÁË£¬ÏÂÃæÎÒÃÇÒª×öµÄ¹¤×÷¾ÍÊÇ¿ØÖÆCharactorÀàµÄ´´½¨¹ý³Ì£¬¼´Èç¹ûÒѾ´æÔÚÁË¡°A¡±×Ö·ûÕâÑùµÄʵÀý£¬¾Í²»ÐèÒªÔÙ´´½¨£¬Ö±½Ó·µ»ØÊµÀý£»Èç¹ûûÓУ¬Ôò´´½¨Ò»¸öеÄʵÀý¡£Èç¹û°ÑÕâÏ×÷½»¸øCharactorÀ࣬¼´CharactorÀàÔÚ¸ºÔðËü×ÔÉíÖ°ÔðµÄͬʱҲҪ¸ºÔð¹ÜÀíCharactorʵÀýµÄ¹ÜÀí¹¤×÷£¬ÕâÔÚÒ»¶¨³Ì¶ÈÉÏÓпÉÄÜÎ¥±³ÀàµÄµ¥Ò»Ö°ÔðÔÔò£¬Òò´Ë£¬ÐèÒªÒ»¸öµ¥¶ÀµÄÀàÀ´×öÕâÏ×÷£¬ÒýÈëCharactorFactoryÀ࣬½á¹¹Í¼ÈçÏ£º

ͼ6
ʾÒâÐÔʵÏÖ´úÂ룺
public class CharactorFactory { // Fields private Hashtable charactors = new Hashtable();
// Constructor
public CharactorFactory()
{
charactors.Add("A", new CharactorA());
charactors.Add("B", new CharactorB());
charactors.Add("C", new CharactorC());
}
// Method
public Charactor GetCharactor(string key)
{
Charactor charactor = charactors[key] as Charactor;
if (charactor == null)
{
switch (key)
{
case "A": charactor = new CharactorA();
break;
case "B": charactor = new CharactorB();
break;
case "C": charactor = new CharactorC();
break;
//
}
charactors.Add(key, charactor);
}
return charactor;
}
} |
µ½ÕâÀïÒѾÍêÈ«½â¾öÁË¿ÉÒÔ¹²ÏíµÄ״̬£¨ÕâÀïºÜ³óªµÄÒ»¸öµØ·½ÊdzöÏÖÁËswitchÓï¾ä£¬µ«Õâ¿ÉÒÔͨ¹ý±ðµÄ°ì·¨Ïû³ý£¬ÎªÁ˼òµ¥ÆÚ¼äÎÒÃÇÏȱ£³ÖÕâÖÖд·¨£©¡£ÏÂÃæµÄ¹¤×÷¾ÍÊÇ´¦Àí¸Õ²Å±»ÎÒÃÇÌÞ³ý³öÈ¥µÄÄÇЩ²»¿É¹²ÏíµÄ״̬£¬ÒòΪËäÈ»½«ÄÇÐ©×´Ì¬ÒÆ³ýÁË£¬µ«ÊÇCharactor¶ÔÏóÈÔÈ»ÐèÒªÕâЩ״̬£¬±»ÎÒÃǰþÀëºóÕâЩ¶ÔÏó¸ù±¾¾ÍÎÞ·¨¹¤×÷£¬ËùÒÔÐèÒª½«ÕâЩ״̬Íⲿ»¯¡£Ê×ÏÈ»áÏëµ½Ò»ÖֱȽϼòµ¥µÄ½â¾ö·½°¸¾ÍÊǶÔÓÚ²»Äܹ²ÏíµÄÄÇЩ״̬£¬²»ÐèҪȥÔÚCharactorÀàÖÐÉèÖ㬶øÖ±½ÓÔÚ¿Í»§³ÌÐò´úÂëÖнøÐÐÉèÖã¬Àà½á¹¹Í¼ÈçÏ£º

ͼ7
ʾÒâÐÔʵÏÖ´úÂ룺
public class Program { public static void Main() { Charactor ca = new CharactorA(); Charactor cb = new CharactorB(); Charactor cc = new CharactorC();
//ÏÔʾ×Ö·û
//ÉèÖÃ×Ö·ûµÄ´óСChangeSize();
}
public void ChangeSize()
{
//ÔÚÕâÀïÉèÖÃ×Ö·ûµÄ´óС
}
} |
°´ÕÕÕâÑùµÄʵÏÖ˼·£¬¿ÉÒÔ·¢ÏÖÈç¹ûÓжà¸ö¿Í»§¶Ë³ÌÐòʹÓõϰ£¬»á³öÏÖ´óÁ¿µÄÖØ¸´ÐÔµÄÂß¼£¬ÓÃÖØ¹¹µÄÊõÓïÀ´ËµÊdzöÏÖÁË´úÂëµÄ»µÎ¶µÀ£¬²»ÀûÓÚ´úÂëµÄ¸´ÓúÍά»¤£»ÁíÍâ°ÑÕâЩ״̬ºÍÐÐÎªÒÆµ½¿Í»§³ÌÐòÀïÃæÆÆ»µÁË·â×°ÐÔµÄÔÔò¡£ÔÙ´Îת±äÎÒÃǵÄʵÏÖ˼·£¬¿ÉÒÔÈ·¶¨µÄÊÇÕâЩ״̬ÈÔÈ»ÊôÓÚCharactor¶ÔÏó£¬ËùÒÔËü»¹ÊÇÓ¦¸Ã³öÏÖÔÚCharactorÀàÖУ¬¶ÔÓÚ²»Í¬µÄ״̬¿ÉÒÔ²ÉÈ¡ÔÚ¿Í»§³ÌÐòÖÐͨ¹ý²ÎÊý»¯µÄ·½Ê½´«Èë¡£Àà½á¹¹Í¼ÈçÏ£º

ͼ8
ʾÒâÐÔʵÏÖ´úÂ룺
public abstract class Charactor { //Fields protected char _symbol;
protected int _width;
protected int _height;
protected int _ascent;
protected int _descent;
protected int _pointSize;
//Method
public abstract void SetPointSize(int size);
public abstract void Display();
}
// "CharactorA"
public class CharactorA : Charactor
{
// Constructor
public CharactorA()
{
this._symbol = 'A';
this._height = 100;
this._width = 120;
this._ascent = 70;
this._descent = 0;
}
//Method
public override void SetPointSize(int size)
{
this._pointSize = size;
}
public override void Display()
{
Console.WriteLine(this._symbol +
"pointsize:" + this._pointSize);
}
}
// "CharactorB"
public class CharactorB : Charactor
{
// Constructor
public CharactorB()
{
this._symbol = 'B';
this._height = 100;
this._width = 140;
this._ascent = 72;
this._descent = 0;
}
//Method
public override void SetPointSize(int size)
{
this._pointSize = size;
}
public override void Display()
{
Console.WriteLine(this._symbol +
"pointsize:" + this._pointSize);
}
}
// "CharactorC"
public class CharactorC : Charactor
{
// Constructor
public CharactorC()
{
this._symbol = 'C';
this._height = 100;
this._width = 160;
this._ascent = 74;
this._descent = 0;
}
//Method
public override void SetPointSize(int size)
{
this._pointSize = size;
}
public override void Display()
{
Console.WriteLine(this._symbol +
"pointsize:" + this._pointSize);
}
}
// "CharactorFactory"
public class CharactorFactory
{
// Fields
private Hashtable charactors = new Hashtable();
// Constructor
public CharactorFactory()
{
charactors.Add("A", new CharactorA());
charactors.Add("B", new CharactorB());
charactors.Add("C", new CharactorC());
}
// Method
public Charactor GetCharactor(string key)
{
Charactor charactor = charactors[key] as Charactor;
if (charactor == null)
{
switch (key)
{
case "A": charactor = new CharactorA();
break;
case "B": charactor = new CharactorB();
break;
case "C": charactor = new CharactorC();
break;
//
}
charactors.Add(key, charactor);
}
return charactor;
}
}
public class Program
{
public static void Main()
{
CharactorFactory factory = new CharactorFactory();
// Charactor "A"
CharactorA ca = (CharactorA)factory.GetCharactor("A");
ca.SetPointSize(12);
ca.Display();
// Charactor "B"
CharactorB cb = (CharactorB)factory.GetCharactor("B");
ca.SetPointSize(10);
ca.Display();
// Charactor "C"
CharactorC cc = (CharactorC)factory.GetCharactor("C");
ca.SetPointSize(14);
ca.Display();
}
} |
¿ÉÒÔ¿´µ½ÕâÑùµÄʵÏÖÃ÷ÏÔÓÅÓÚµÚÒ»ÖÖʵÏÖ˼·¡£ºÃÁË£¬µ½ÕâÀïÎÒÃǾ͵½µ½ÁËͨ¹ýFlyweightģʽʵÏÖÁËÓÅ»¯×ÊÔ´µÄÕâÑùÒ»¸öÄ¿µÄ¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬»¹ÓÐÈçϼ¸µãÐèҪ˵Ã÷£º
1£®ÒýÈëCharactorFactoryÊǸö¹Ø¼ü£¬ÔÚÕâÀï´´½¨¶ÔÏóÒѾ²»ÊÇnewÒ»¸öCharactor¶ÔÏóÄÇô¼òµ¥£¬¶ø±ØÐëÓù¤³§·½·¨·â×°ÆðÀ´¡£
2£®ÔÚÕâ¸öÀý×ÓÖаÑCharactor¶ÔÏó×÷ΪFlyweight¶ÔÏóÊÇ·ñ׼ȷֵµÄ¿¼ÂÇ£¬ÕâÀïÖ»ÊÇΪÁË˵Ã÷Flyweightģʽ£¬ÖÁÓÚÔÚʵ¼ÊÓ¦ÓÃÖУ¬ÄÄЩ¶ÔÏóÐèÒª×÷ΪFlyweight¶ÔÏóÊÇÒª¾¹ýºÜºÃµÄ¼ÆËãµÃÖª£¬¶ø¾ø²»ÊÇÆ¾¿ÕÒÜÏë¡£
3£®Çø·ÖÄÚÍⲿ״̬ºÜÖØÒª£¬ÕâÊÇÏíÔª¶ÔÏóÄÜ×öµ½ÏíÔªµÄ¹Ø¼üËùÔÚ¡£
µ½ÕâÀÆäʵÎÒÃǵÄÌÖÂÛ»¹Ã»ÓнáÊø¡£ÓÐÈË¿ÉÄÜ»áÌá³öÈçÏÂÎÊÌ⣬ÏíÔª¶ÔÏó£¨Charactor£©ÔÚÕâ¸öϵͳÖÐÏà¶ÔÓÚÿһ¸öÄÚ²¿×´Ì¬¶øÑÔËüÊÇΨһµÄ£¬Õâ¸úµ¥¼þģʽÓÐÊ²Ã´Çø±ðÄØ£¿Õâ¸öÎÊÌâÒѾºÜºÃ»Ø´ðÁË£¬ÄǾÍÊǵ¥¼þÀàÊDz»ÄÜÖ±½Ó±»ÊµÀý»¯µÄ£¬¶øÏíÔªÀàÊÇ¿ÉÒÔ±»ÊµÀý»¯µÄ¡£ÊÂʵÉÏÔÚÕâÀïÃæÕæÕý±»Éè¼ÆÎªµ¥¼þµÄÓ¦¸ÃÊÇÏíÔª¹¤³§£¨²»ÊÇÏíÔª£©À࣬ÒòΪÈç¹û´´½¨ºÜ¶à¸öÏíÔª¹¤³§µÄʵÀý£¬ÄÇÎÒÃÇËù×öµÄÒ»ÇÐŬÁ¦¶¼Êǰ׷ѵ쬲¢Ã»ÓмõÉÙ¶ÔÏóµÄ¸öÊý¡£Ð޸ĺóµÄÀà½á¹¹Í¼ÈçÏ£º

ͼ9
ʾÒâÐÔʵÏÖ´úÂ룺
public class CharactorFactory { // Fields private Hashtable charactors = new Hashtable();
private CharactorFactory instance;
// Constructor
private CharactorFactory()
{
charactors.Add("A", new CharactorA());
charactors.Add("B", new CharactorB());
charactors.Add("C", new CharactorC());
}
// Property
public CharactorFactory Instance
{
get
{
if (instance != null)
{
instance = new CharactorFactory();
}
return instance;
}
}
// Method
public Charactor GetCharactor(string key)
{
Charactor charactor = charactors[key] as Charactor;
if (charactor == null)
{
switch (key)
{
case "A": charactor = new CharactorA();
break;
case "B": charactor = new CharactorB();
break;
case "C": charactor = new CharactorC();
break;
//
}
charactors.Add(key, charactor);
}
return charactor;
}
}
|
.NET¿ò¼ÜÖеÄFlyweight
Flyweight¸ü¶àʱºòµÄʱºòÒ»ÖֵײãµÄÉè¼ÆÄ£Ê½£¬ÔÚÎÒÃǵÄʵ¼ÊÓ¦ÓóÌÐòÖÐʹÓõIJ¢²»ÊǺܶࡣÔÚ.NETÖеÄStringÀàÐÍÆäʵ¾ÍÊÇÔËÓÃÁËFlyweightģʽ¡£¿ÉÒÔÏëÏó£¬Èç¹ûÿ´ÎÖ´ÐÐstring
s1 = ¡°abcd¡±²Ù×÷£¬¶¼´´½¨Ò»¸öеÄ×Ö·û´®¶ÔÏóµÄ»°£¬ÄÚ´æµÄ¿ªÏú»áºÜ´ó¡£ËùÒÔ.NETÖÐÈç¹ûµÚÒ»´Î´´½¨ÁËÕâÑùµÄÒ»¸ö×Ö·û´®¶ÔÏós1£¬Ï´ÎÔÙ´´½¨ÏàͬµÄ×Ö·û´®s2ʱֻÊǰÑËüµÄÒýÓÃÖ¸Ïò¡°abcd¡±£¬ÕâÑù¾ÍʵÏÖÁË¡°abcd¡±ÔÚÄÚ´æÖеĹ²Ïí¡£¿ÉÒÔͨ¹ýÏÂÃæÒ»¸ö¼òµ¥µÄ³ÌÐòÀ´ÑÝʾs1ºÍs2µÄÒýÓÃÊÇ·ñÒ»Ö£º
public class Program { public static void Main(string[] args) { string s1 = "abcd"; string s2 = "abcd";
Console.WriteLine(Object.ReferenceEquals(s1,s2));
Console.ReadLine();
}
} |
¿ÉÒÔ¿´µ½£¬Êä³öµÄ½á¹ûΪTrue¡£µ«ÊÇ´ó¼ÒҪעÒâµÄÊÇÈç¹ûÔÙÓÐÒ»¸ö×Ö·û´®s3£¬ËüµÄ³õʼֵΪ¡°ab¡±£¬ÔÙ¶ÔËü½øÐвÙ×÷s3
= s3 + ¡°cd¡±£¬ÕâʱËäÈ»s1ºÍs3µÄÖµÏàͬ£¬µ«ÊÇËüÃǵÄÒýÓÃÊDz»Í¬µÄ¡£¹ØÓÚStringµÄÏêϸÇé¿ö´ó¼Ò¿ÉÒԲο¼SDK£¬ÕâÀï²»ÔÙÌÖÂÛÁË¡£
Ч¹û¼°ÊµÏÖÒªµã
1£®ÃæÏò¶ÔÏóºÜºÃµÄ½â¾öÁ˳éÏóÐÔµÄÎÊÌ⣬µ«ÊÇ×÷Ϊһ¸öÔËÐÐÔÚ»úÆ÷ÖеijÌÐòʵÌ壬ÎÒÃÇÐèÒª¿¼ÂǶÔÏóµÄ´ú¼ÛÎÊÌâ¡£FlyweightÉè¼ÆÄ£Ê½Ö÷Òª½â¾öÃæÏò¶ÔÏóµÄ´ú¼ÛÎÊÌ⣬һ°ã²»´¥¼°ÃæÏò¶ÔÏóµÄ³éÏóÐÔÎÊÌâ¡£
2£®Flyweight²ÉÓöÔÏó¹²ÏíµÄ×ö·¨À´½µµÍϵͳÖжÔÏóµÄ¸öÊý£¬´Ó¶ø½µµÍϸÁ£¶È¶ÔÏó¸øÏµÍ³´øÀ´µÄÄÚ´æÑ¹Á¦¡£ÔÚ¾ßÌåʵÏÖ·½Ã棬ҪעÒâ¶ÔÏó״̬µÄ´¦Àí¡£
3£®ÏíԪģʽµÄÓŵãÔÚÓÚËü´ó·ù¶ÈµØ½µµÍÄÚ´æÖжÔÏóµÄÊýÁ¿¡£µ«ÊÇ£¬Ëü×öµ½ÕâÒ»µãËù¸¶³öµÄ´ú¼ÛÒ²ÊǺܸߵģºÏíԪģʽʹµÃϵͳ¸ü¼Ó¸´ÔÓ¡£ÎªÁËʹ¶ÔÏó¿ÉÒÔ¹²Ïí£¬ÐèÒª½«Ò»Ð©×´Ì¬Íⲿ»¯£¬ÕâʹµÃ³ÌÐòµÄÂß¼¸´ÔÓ»¯¡£ÁíÍâËü½«ÏíÔª¶ÔÏóµÄ״̬Íⲿ»¯£¬¶ø¶ÁÈ¡Íⲿ״̬ʹµÃÔËÐÐʱ¼äÉÔ΢±ä³¤¡£
ÊÊÓÃÐÔ
µ±ÒÔÏÂËùÓеÄÌõ¼þ¶¼Âú×ãʱ£¬¿ÉÒÔ¿¼ÂÇʹÓÃÏíԪģʽ£º
1¡¢ Ò»¸öϵͳÓдóÁ¿µÄ¶ÔÏó¡£
2¡¢ ÕâЩ¶ÔÏóºÄ·Ñ´óÁ¿µÄÄÚ´æ¡£
3¡¢ ÕâЩ¶ÔÏóµÄ״̬ÖеĴ󲿷ֶ¼¿ÉÒÔÍⲿ»¯¡£
4¡¢ ÕâЩ¶ÔÏó¿ÉÒÔ°´ÕÕÄÚÔÌ״̬·Ö³ÉºÜ¶àµÄ×飬µ±°ÑÍâÔ̶ÔÏó´Ó¶ÔÏóÖÐÌÞ³ýʱ£¬Ã¿Ò»¸ö×é¶¼¿ÉÒÔ½öÓÃÒ»¸ö¶ÔÏó´úÌæ¡£
5¡¢ Èí¼þϵͳ²»ÒÀÀµÓÚÕâЩ¶ÔÏóµÄÉí·Ý£¬»»ÑÔÖ®£¬ÕâЩ¶ÔÏó¿ÉÒÔÊDz»¿É·Ö±æµÄ¡£
Âú×ãÒÔÉϵÄÕâЩÌõ¼þµÄϵͳ¿ÉÒÔʹÓÃÏíÔª¶ÔÏó¡£×îºó£¬Ê¹ÓÃÏíԪģʽÐèҪά»¤Ò»¸ö¼Ç¼ÁËϵͳÒÑÓеÄËùÓÐÏíÔªµÄ±í£¬¶øÕâÐèÒªºÄ·Ñ×ÊÔ´¡£Òò´Ë£¬Ó¦µ±ÔÚÓÐ×ã¹»¶àµÄÏíԪʵÀý¿É¹©¹²Ïíʱ²ÅÖµµÃʹÓÃÏíԪģʽ¡£
×ܽá
Flyweightģʽ½â¾öµÄÊÇÓÉÓÚ´óÁ¿µÄϸÁ£¶È¶ÔÏóËùÔì³ÉµÄÄڴ濪ÏúµÄÎÊÌ⣬ËüÔÚʵ¼ÊµÄ¿ª·¢Öв¢²»³£Ó㬵«ÊÇ×÷Ϊµ×²ãµÄÌáÉýÐÔÄܵÄÒ»ÖÖÊÖ¶ÎÈ´ºÜÓÐЧ¡£
|