简介:
享元模式使用或创建共享使用大量类似的对象。当对象的数量太大,每次都需通过new创建,会给系统带来难以承受的内存开销。
介绍:
优点 |
1.减少系统创建的个数。因为无需多次创建,静态保存,可共享使用。 2.外部状态和内部相对独立。 |
缺点 | 1.存在内部状态和外部状态,增加复杂度。 |
特点 |
1.创建大量的对象。 2.对象可共享使用。 |
抽象享元角色(Flyweight) | 具体享元类的基类。 |
具体享元角色(ConcreteFlyweight) | 实现抽象享元角色所规定的接口。 |
不共享具体享元角色(UnsharedConcreteFlyweight) | 无需共享。可无。 |
享元工厂角色(FlyweightFactory) | 负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。存在即共享,不存在要创建。 |
使用:
在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态。而随环境改变而改变的,不可以共享的状态就是外部状态了。
//Flyweight
public abstract class Shape
{
public int index { get; private set; } //index:内部状态
public Shape(int index)
{
this.index = index;
}
public abstract void Draw(int num); //num:外部状态
}
public enum enumShapeType
{
enumSquare,
enumCircle,
}
//ConcreteFlyweight
public sealed class Square : Shape
{
public Square(int index) : base(index) { }
public override void Draw(int num)
{
//do something
}
}
//ConcreteFlyweight
public sealed class Circle : Shape
{
public Circle(int index) : base(index) { }
public override void Draw(int num)
{
//do something
}
}
//FlyweightFactory
public sealed class ShapeFactory
{
private static List<Shape> shapes;
private int index;
static ShapeFactory()
{
shapes = new List<Shape>();
}
public Shape GetShape(int index,enumShapeType name)
{
this.index = index;
foreach (Shape shape in shapes)
{
if (shape.index == index)
{
return shape;
}
}
Shape sh = null;
if (name == enumShapeType.enumSquare)
{
sh = new Square(index);
}
else if (name == enumShapeType.enumCircle)
{
sh = new Circle(index);
}
shapes.Add(sh);
return sh;
}
}
//享元模式调用
ShapeFactory factory = new ShapeFactory();
for (int i = 0; i < 10; i++)
{
Shape shape = null;
if (i < 5)
{
shape = factory.GetShape(i, enumShapeType.enumSquare);
}
else
{
shape = factory.GetShape(i, enumShapeType.enumCircle);
}
shape.Draw(1);
}