在c#中使用轻量级模式 (Flyweight模式)

介绍 

在今天的文章中,我们将研究c#中的Flyweight模式(轻量级模式)。此模式用于以有效的方式创建可重用对象,可由不同的客户端使用。

我们还将看一个使用此模式的实际示例。


Flyweight模式是什么?什么时候使用它?

Flyweight模式是c#中的一种结构模式。这意味着它是由设计时的结构定义的。在轻量级模式中,我们只需创建许多相关的类,并根据客户机的请求类型为调用客户机提供一个实例。这些实例保存在一个对象中,例如Dictionary等,并按需提供给调用客户机。因此,我们在flyweight模式中使用另一个模式,这就是工厂模式。让我们看一个例子,它将使这个模式更加清晰。

 

使用Flyweight模式

让我们使用Visual Studio 2019 Community Edition创建一个简单的控制台应用程序。我们将为这个项目选择。net 5框架。

现在,更新这两个文件中的代码,如下所示,

 

(Program.cs)

using ConsoleAppFlyWeight;  
using System;  
string empType = "FullTime";  
var factory = new EmployeeTaxFactory();  
var employeeTax = factory.GetEmployeeTaxBracket(empType);  
employeeTax.DisplayTaxBracket();  
empType = "PartTime";  
employeeTax = factory.GetEmployeeTaxBracket(empType);  
employeeTax.DisplayTaxBracket();  
empType = "FullTime";  
employeeTax = factory.GetEmployeeTaxBracket(empType);  
employeeTax.DisplayTaxBracket();  
Console.ReadKey();

(Flyweight.cs)

using System;  
using System.Collections.Generic;  
namespace ConsoleAppFlyWeight {  
    public interface IEmployeeTax {  
        string EmployeeType {  
            get;  
            set;  
        }  
        int TaxBracket {  
            get;  
            set;  
        }  
        void DisplayTaxBracket();  
    }  
    public class EmployeeTaxFactory {  
        private Dictionary < string, IEmployeeTax > _employeesTax = new();  
        public IEmployeeTax GetEmployeeTaxBracket(string key) {  
            IEmployeeTax employeeTax = null;  
            if (_employeesTax.ContainsKey(key)) {  
                employeeTax = _employeesTax[key];  
            } else {  
                switch (key) {  
                    case "FullTime":  
                        employeeTax = new FullTimeEmployee();  
                        break;  
                    case "PartTime":  
                        employeeTax = new PartTimeEmployee();  
                        break;  
                }  
                _employeesTax.Add(key, employeeTax);  
            }  
            return employeeTax;  
        }  
    }  
    public class FullTimeEmployee: IEmployeeTax {  
        public string EmployeeType {  
            get;  
            set;  
        }  
        public int TaxBracket {  
            get;  
            set;  
        }  
        public FullTimeEmployee() {  
            EmployeeType = "FullTime";  
            TaxBracket = 1;  
        }  
        public void DisplayTaxBracket() {  
            Console.WriteLine($ "The Tax Bracket is {TaxBracket}");  
        }  
    }  
    public class PartTimeEmployee: IEmployeeTax {  
        public string EmployeeType {  
            get;  
            set;  
        }  
        public int TaxBracket {  
            get;  
            set;  
        }  
        public PartTimeEmployee() {  
            EmployeeType = "PartTime";  
            TaxBracket = 2;  
        }  
        public void DisplayTaxBracket() {  
            Console.WriteLine($ "The Tax Bracket is {TaxBracket}");  
        }  
    }  
}

当我们运行应用程序时,我们会看到下面的内容,


在Flyweight.cs文件中,我们创建了一个接口和两个具体类,每个类都实现了这个接口。最后,我们创建工厂类,它是这个模式的核心,在这个模式中我们检查请求类型(在我们的示例代码中可以是全职的或兼职的),并返回特定的具体类。与简单工厂模式的主要区别是,我们还在字典对象中维护这个实例,当有针对该类的后续请求时,我们从字典中返回它。您可以在工厂类中放置一个断点,并查看当我们请求全职类时,它第二次从字典中返回。因此,我建议这种模式只适用于简单的、短跨度的类。

 

总结

在本文中,我们研究了c#中的轻量级模式。我们还研究了此模式的实际实现,以及何时应该将此模式用于标准工厂模式。编码快乐!

文档:C#24种设计模式