Flyweight享元模式属于结构型设计模式,旨在通过在相似对象之间共享数据来减少内存使用,以提高性能。
Design Pattern:Flyweight 🔗
基本介绍 🔗
构成 🔗
- Flyweight:抽象享元类,规定出需要实现的公共接口,可以通过该接口接收外部状态并对其进行操作。
- ConcreteFlyweight:具体享元类,实现抽象享元类所规定的接口,如果有内部状态的话,为内在状态添加存储。
- FlyweightFactory:享元工厂类,创建和管理享元对象,当客户端请求享元时,享元工厂对象将现有实例赋值或创建一个实例。
- Client:客户类,维护对享元的引用,计算或存储享元的外部状态。
优点 🔗
- 通过创建共享对象(享元)来减少对象的数量,从而减少了内存,提高了性能。
- 由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元对象能够在不同的环境被共享。
缺点 🔗
- 需要区分外部状态和内部状态,使得代码在某种程度上来说更加复杂化了。
- 为了使对象可以共享,享元模式需要将享元对象的状态外部化。
实例 🔗
C#中享元模式的实例,比方说我们开发一款画图工具,里面需要画各种颜色的圆形,我们不可能每种颜色的圆形做一个实例,这个时候我们可以享元模型,共享形状,然后添加不同的颜色。
public abstract class Shape
{
/// <summary>
/// 设置颜色值
/// </summary>
/// <param name="color"></param>
public abstract void SetColor(string color);
/// <summary>
/// 绘制
/// </summary>
public abstract void Draw();
}
/// <summary>
/// 圆形
/// </summary>
public sealed class Circle : Shape
{
private string _strColor;
public override void SetColor(string color)
{
_strColor = color;
}
public override void Draw()
{
Console.WriteLine("Circle color " + _strColor);
}
}
/// <summary>
/// 形状工程
/// </summary>
public sealed class ShapeFactory
{
private static Dictionary<string, Shape> _shapes = new Dictionary<string, Shape>();
public static Shape GetShape(string shapetype)
{
if (!_shapes.ContainsKey(shapetype))
{
//switch缩略写法
switch (shapetype)
{
case "Circle":
{
var shape = new Circle();
_shapes.Add(shapetype, shape);
}
break;
}
}
return _shapes[shapetype];
}
}
实际运行:
Circle redCircle = (Circle)ShapeFactory.GetShape("Circle");
redCircle.SetColor("Red");
redCircle.Draw();
Circle greenCircle = (Circle)ShapeFactory.GetShape("Circle");
greenCircle.SetColor("Green");
greenCircle.Draw();
Circle orangeCircle = (Circle)ShapeFactory.GetShape("Circle");
orangeCircle.SetColor("Orange");
orangeCircle.Draw();
结论 🔗
搬砖愉快!