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