main
syneffort 2 years ago
parent d9134f2641
commit 4861f7271c
  1. 4
      DesignPatternGuru/Flyweight/Flyweight.csproj
  2. 16
      DesignPatternGuru/Flyweight/Flyweights/Flyweight.cs
  3. 67
      DesignPatternGuru/Flyweight/Flyweights/FlyweightFactory.cs
  4. 47
      DesignPatternGuru/Flyweight/Program.cs

@ -7,4 +7,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

@ -1,4 +1,6 @@
using System;
using Flyweight.Objects;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -8,6 +10,18 @@ namespace Flyweight.Flyweights
{
internal class Flyweight
{
private Car _sharedState;
public Flyweight(Car car)
{
_sharedState = car;
}
public void Operation(Car uniqueState)
{
string s = JsonConvert.SerializeObject(_sharedState);
string u = JsonConvert.SerializeObject(uniqueState);
Console.WriteLine($"Flyweight: Displaying shared {s} and unique {u} state.");
}
}
}

@ -0,0 +1,67 @@
using Flyweight.Objects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Flyweight.Flyweights
{
internal class FlyweightFactory
{
private List<Tuple<Flyweight, string>> _flyweights = new List<Tuple<Flyweight, string>>();
public FlyweightFactory(params Car[] args)
{
foreach (var elem in args)
{
_flyweights.Add(new Tuple<Flyweight, string>(new Flyweight(elem), GetKey(elem)));
}
}
public string GetKey(Car car)
{
List<string> elements = new List<string>();
elements.Add(car.Model);
elements.Add(car.Color);
elements.Add(car.Company);
if (car.Owner != null && car.Number != null)
{
elements.Add(car.Number);
elements.Add(car.Owner);
}
elements.Sort();
return String.Join("_", elements);
}
public Flyweight GetFlyweight(Car sharedState)
{
string key = GetKey(sharedState);
if (_flyweights.Where(t => t.Item2 == key).Count() == 0)
{
Console.WriteLine("FlyweightFactory: Can't find a flyweight, creating new one.");
_flyweights.Add(new Tuple<Flyweight, string>(new Flyweight(sharedState), key));
}
else
{
Console.WriteLine("FlyweightFactory: Reusing existing flyweight.");
}
return _flyweights.Where(t => t.Item2 == key).FirstOrDefault().Item1;
}
public void ListFlyweights()
{
int count = _flyweights.Count;
Console.WriteLine($"FlyweightFactory: I have {count} flyweights");
foreach (var flyweight in _flyweights)
{
Console.WriteLine(flyweight.Item2);
}
}
}
}

@ -1,10 +1,53 @@
namespace Flyweight
using Flyweight.Flyweights;
using Flyweight.Objects;
namespace Flyweight
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var factory = new FlyweightFactory(
new Car { Company = "Chevrolet", Model = "Camaro2018", Color = "pink" },
new Car { Company = "Mercedes Benz", Model = "C300", Color = "black" },
new Car { Company = "Mercedes Benz", Model = "C500", Color = "red" },
new Car { Company = "BMW", Model = "M5", Color = "red" },
new Car { Company = "BMW", Model = "X6", Color = "white" }
);
factory.ListFlyweights();
AddCarToPoliceDatabase(factory, new Car
{
Number = "CL234IR",
Owner = "James Doe",
Company = "BMW",
Model = "M5",
Color = "red"
});
AddCarToPoliceDatabase(factory, new Car
{
Number = "CL234IR",
Owner = "James Doe",
Company = "BMW",
Model = "X1",
Color = "red"
});
factory.ListFlyweights();
}
public static void AddCarToPoliceDatabase(FlyweightFactory factory, Car car)
{
Console.WriteLine("Client: Adding a car to database.");
var flyweight = factory.GetFlyweight(new Car
{
Color = car.Color,
Model = car.Model,
Company = car.Company,
});
flyweight.Operation(car);
}
}
}
Loading…
Cancel
Save