享元
Terrylee,2006年3月
摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?
本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考、探索、权衡,通过比较而得出好的实现方式,而不是给你最终的一个完美解决方案。
主要内容:
1. Flyweight模式解说
2..NET中的Flyweight模式
3.Flyweight模式的实现要点
……
概述
面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?
意图
运用共享技术有效地支持大量细粒度的对象。[GOF 《设计模式》]
结构图

代码
1
namespace Bll
2
{
3
public class Car
4
{
5
public string Body;
6
public string Wheel;
7
public string Engine;
8
public string Color;
9
10
public Car(string body, string wheel, string engine, string color)
11
{
12
}
13
}
14
15
public class FlyWeightCar
16
{
17
public String Brand;
18
19
private Car car;
20
public Car Car
21
{
22
get { return car; }
23
set { car = value; }
24
}
25
}
26
27
public class FlyWeightFactory
28
{
29
private static FlyWeightCar car;
30
private static Hashtable table = new Hashtable();
31
public static FlyWeightCar CreateInit(string body, string wheel, string engine, string brand, string color)
32
{
33
if (table[brand] != null)
34
{
35
car = (FlyWeightCar)table[brand];
36
}
37
else
38
{
39
car = new FlyWeightCar();
40
car.Brand = brand;
41
car.Car = new Car(body, wheel, engine, color);
42
table.Add(brand, car);
43
}
44
return car;
45
}
46
}
47
}
namespace Bll2
{3
public class Car4
{5
public string Body;6
public string Wheel;7
public string Engine;8
public string Color;9

10
public Car(string body, string wheel, string engine, string color)11
{12
}13
}14

15
public class FlyWeightCar16
{17
public String Brand;18

19
private Car car;20
public Car Car21
{22
get { return car; }23
set { car = value; }24
}25
}26

27
public class FlyWeightFactory28
{29
private static FlyWeightCar car;30
private static Hashtable table = new Hashtable();31
public static FlyWeightCar CreateInit(string body, string wheel, string engine, string brand, string color)32
{33
if (table[brand] != null)34
{35
car = (FlyWeightCar)table[brand];36
}37
else38
{39
car = new FlyWeightCar();40
car.Brand = brand;41
car.Car = new Car(body, wheel, engine, color);42
table.Add(brand, car);43
}44
return car;45
}46
}47
}



浙公网安备 33010602011771号