今天好好的研究了下flyweight这个模式,发现我以前对这个模式误解很深。
这个模式是为了解决:大量非常相似的类的开销。
比如,我们在程序中会遇见一种情况,一个Folder类除了名字和坐标位置是不同的,其他的完全相同,那么我们可以把这个名字和位置作为外部的数据导入到绘制方法来进行绘制,所以,我们只需要一个Folder的实例,就可以绘制出多个同一实例的Folder,而不是一个类在内部实现这些参数,这样,就避免了大量类的创建。
先看下类图
代码如下:
public interface IFlyWeight { void Load(); void Display(); }
public class FlyWeight:IFlyWeight { Image m_image; public void Load(string fileName) { Image image = Bitmap.FromFile(fileName); } public void Display() { //Show image } }
public class FlyweightFactory { Dictionary<string, IFlyWeight> m_dictionary = new Dictionary<string, IFlyWeight>(); public FlyweightFactory() { m_dictionary.Clear(); } public IFlyWeight this[string index] { get { if (!m_dictionary.ContainsKey(index)) m_dictionary[index] = new FlyWeight(); return m_dictionary[index]; } } }
这个工厂的作用是:需要Flyweight时,就去这个工厂找一个出来,如果没有,就创建一个新的。
这里可以看出来,Flyweight并不能减少对象的创建,因为每一个Ifryweight都是不同的,所以,flyweight只能减少同一对象的创建(Flyweight的工厂)。
IFlkweight解决的是共享。
比如,一个显示图片的程序,如果要显示的图片都不同,尽管我们使用了IFlyweight模式,但是是无法体现减少对象的优势的,该生成多少的图片对象,还是生成了多少。但是,当我们程序中有大量相同图片时,这时候,他就起到作用了,我们使用同一个图片对象,然后通过不同的Display的参数(比如坐标x,y),把它共享了。
那么,这个模式就有点类似string的创建,当你创建2个相同的字符串时,其实他们是一个内容。