簡介:
享元模式使用或創建共享使用大量類似的對象。當對象的數量太大,每次都需通過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);
}