设计模式可帮助我们解决软件开发中经常遇到的设计问题,并减少代码的复杂性。 四人帮的设计模式可分为三类:创造型,结构型和行为型。
Flyweight设计模式属于结构类别。 Flyweight模式有助于同时使用多个相似对象时减少内存消耗。 本文研究了如何在C#中使用Flyweight设计模式。
[ 同样在InfoWorld上:我们暗恋的10种不良编程习惯 ]
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
在Visual Studio中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个.NET Core Console Application项目。 假设系统中已安装Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的.NET Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
现在,您应该已经准备好在Visual Studio 2019中运行一个新的.NET Core控制台应用程序项目。我们将在本文的后续部分中使用此项目。
Flyweight设计模式及其用法
Flyweight设计模式减少了在应用程序中创建多个相同类型的大对象所需的内存量。 飞锤是通过与相似对象共享数据来减轻内存压力的对象。 因此,仅在需要时(即,如果没有匹配的对象可用)才创建一个新对象。 通过减少内存占用,Flyweight模式提高了性能。
Flyweight模式的典型用例是需要创建相同类型的大对象时。 四人帮的描述 :“使用共享有效地支持大量细粒度对象。”
飞行重量对象可以具有以下任一状态:
- 内部状态-数据与状态无关,通常存储在flyweight对象内部,并且可以共享
- 外在状态-数据取决于状态,因此无法共享
Flyweight设计模式的参与者包括:
- Flyweight —通常是Flyweight对象的接口
- ConcreteFlyweight-这是实现Flyweight接口的类
- FlyweightFactory —这是一个工厂类,用于创建ConcreteFlyweight类型的混凝土对象
- 客户端-存储对flyweight实例的引用
[ 同样在InfoWorld上:.NET 5.0不会附带的.NET Framework API ]
在C#中实现Flyweight抽象类和方法
为了在C#中实现Flyweight设计模式,让我们从定义名为Flyweight的抽象基类开始。 此类将包含一个名为Display的抽象方法的声明。 以下代码段说明了Flyweight抽象类。
public abstract class Flyweight
{
public abstract void Display();
}
ConcreteFlyweight类扩展了Flyweight类并实现了abstract方法。 下面的代码清单显示了ConcreteFlyweight类。
public class ConcreteFlyweight : Flyweight
{
private readonly string _key = null;
public ConcreteFlyweight(string key)
{
_key = key;
}
public override void Display()
{
Console.WriteLine("The Key is: "+ _key);
}
}
在C#中实现FlyweightFactory类
FlyweightFactory类在Dictionary的实例中创建并存储flyweight实例。 此类包含GetFlyweight()方法,该方法根据给定的键返回ConcreteFlyweight实例。 如果该实例存在于Dictionary中,则将其返回,否则将创建并返回一个新的ConcreteFlyweight实例。 下面的代码清单说明了FlyweightFactory类。
public class FlyweightFactory
{
private Dictionary<string, Flyweight> flyweights = new
Dictionary<string, Flyweight>();
public Flyweight GetFlyweight(string key)
{
Flyweight flyweight = null;
if (flyweights.ContainsKey(key))
{
flyweight = flyweights[key];
}
else
{
flyweight = new ConcreteFlyweight(key);
flyweights.Add(key, flyweight);
}
return flyweight;
}
}
请注意,在此示例中,我们使用了一个ConcreteFlyweight类。 此类的多个实例在键的值上彼此不同。 在实践中,您可能想要创建几个扩展Flyweight类的具体类。 为了简单起见,我们在这里省略了多个实例。
[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]
在C#中实现Flyweight客户端
最后,这是客户端的外观。
static void Main(string[] args)
{
var factory = new FlyweightFactory();
var flyweight = factory.GetFlyweight("A");
flyweight.Display();
Console.Read();
}
C#中的举重设计模式示例
这是完整的程序供您参考。
public abstract class Flyweight
{
public abstract void Display();
}
public class ConcreteFlyweight : Flyweight
{
private readonly string _key = null;
public ConcreteFlyweight(string key)
{
_key = key;
}
public override void Display()
{
Console.WriteLine("The Key is: "+ _key);
}
}
public class FlyweightFactory
{
private Dictionary<string, Flyweight> flyweights = new
Dictionary<string, Flyweight>();
public Flyweight GetFlyweight(string key)
{
Flyweight flyweight = null;
if (flyweights.ContainsKey(key))
{
flyweight = flyweights[key];
}
else
{
flyweight = new ConcreteFlyweight(key);
flyweights.Add(key, flyweight);
}
return flyweight;
}
}
class Program
{
static void Main(string[] args)
{
var factory = new FlyweightFactory();
var flyweight = factory.GetFlyweight("A");
flyweight.Display();
Console.Read();
}
}
当执行上述程序时,您应该看到以下输出。
在内存可用性受到限制的情况下,您可以利用Flyweight设计模式。 但是,在实践中,实施Flyweight设计模式所涉及的复杂性往往超过了收益。 因此,Flyweight模式的用途受到限制。 在许多情况下,更好的替代方法是Prototype设计模式 。
From: https://www.infoworld.com/article/3511625/how-to-use-the-flyweight-design-pattern-in-c.html