员工的工资计算来自两个要素 - Basic
和StandardPoint
。一名员工每个月将获得一个Basic和一个或多个(或不包含)StandardPoint。如何避免创建多个对象实例?
有各种StandardPoints - StarPerformerPoint,RecognitionPoint,ReferralPoint,BrandingPoint。
有一个功能来计算TotalAnnualSalary。在一年内,员工有资格获得最多4个标准积分。即使他得到更多分数,也只会计算总年薪计算中的4分。
我有以下代码。它工作正常。但是,存在一个无效的内存利用率。 StandardPointElement被创建多次。
我们如何在这种情况下优化对象创建?
UPDATE
我们可以使用类似轻量级的模式?
甲轻量级是,通过与其它类似的对象共享尽可能多的数据可以最小化存储器使用的对象;当简单的重复表示使用不可接受的内存量时,这是一种大量使用对象的方法。
在文章Flyweight Design Pattern - C#,赛伦德拉Chauhan保持提到了以下
外在数据被计算的飞行装置在运行时,它被保持在轻量级对象以外的区域。因此它可以是有状态的。
Why is the Flyweight Pattern practical?
代码
interface ISalaryScoreElement
{
int SalaryScore { get; }
}
public class BasicElement : ISalaryScoreElement
{
public int SalaryScore
{
get
{
return 100;
}
}
}
public class StandardPointElement : ISalaryScoreElement
{
public int SalaryScore
{
get
{
return 10;
}
}
}
Employee类
class Employee
{
private List<string> eligibility;
public List<string> EligibleSalaryTypes
{
get
{
return eligibility;
}
}
public Employee(List<string> eligibility)
{
this.eligibility = eligibility;
}
public int GetTotalAnnualSalary()
{
int totalSalary = 0;
ISalaryScoreElement sal = null;
CalculatorFactory factory = new CalculatorFactory();
int occurenceCountForStandardPoint = 0;
foreach (string salaryType in EligibleSalaryTypes)
{
switch (salaryType)
{
case "Basic":
sal = factory.GetSalaryElement("BasicElement");
break;
case "ReferralPoint":
sal = factory.GetSalaryElement("StandardPointElement");
break;
case "BrandingPoint":
sal = factory.GetSalaryElement("StandardPointElement");
break;
case "RecognitionPoint":
sal = factory.GetSalaryElement("StandardPointElement");
break;
case "StarPerformerPoint":
sal = factory.GetSalaryElement("StandardPointElement");
break;
default:
throw new Exception("No mapping available");
}
if (sal is StandardPointElement)
{
occurenceCountForStandardPoint++;
if (occurenceCountForStandardPoint > 4)
{
//StandardPointElement can be considered a maximum of 4 times for salary calculation
continue;
}
}
totalSalary = totalSalary + sal.SalaryScore;
}
return totalSalary;
}
}
厂
class CalculatorFactory
{
public ISalaryScoreElement GetSalaryElement(string salaryKey)
{
ISalaryScoreElement c = null;
switch (salaryKey)
{
case "BasicElement":
c = new BasicElement();
break;
case "StandardPointElement":
c = new StandardPointElement();
break;
default:
throw new Exception("Factory cannot create the object specified");
}
return c;
}
}
客户
class Program
{
static void Main(string[] args)
{
List<string> eligibleBonus = new List<string>();
//For January 2013
eligibleBonus.Add("Basic");
eligibleBonus.Add("StarPerformerPoint");
//For February 2013
eligibleBonus.Add("Basic");
eligibleBonus.Add("StarPerformerPoint");
eligibleBonus.Add("ReferralPoint");
//For March 2013
eligibleBonus.Add("Basic");
eligibleBonus.Add("BrandingPoint");
eligibleBonus.Add("RecognitionPoint");
//For April 2013
eligibleBonus.Add("Basic");
eligibleBonus.Add("BrandingPoint");
Employee e = new Employee(eligibleBonus);
int effectiveSalary = e.GetTotalAnnualSalary();
Console.WriteLine(effectiveSalary);
Console.ReadKey();
}
}
您已经发布了一段代码,几乎给了我们一些指导:“但是,内存使用效率并不高。 StandardPointElement是多次创建的“。这还不够具体,请更准确地描述你认为你的问题代码是什么,以及你认为问题是什么。 –