享元模式 Flyweight
阿新 • • 發佈:2022-05-20
用途:節約空間,共享單元
示例1:重複使用者
public class User { string fullName; public User(string fullName) { this.fullName = fullName; } public override string ToString() { return fullName; } } class Program {static void Main(string[] args) { var fristNames = Enumerable.Range(0, 100).Select(_ => RandomString()); var LastNames = Enumerable.Range(0, 100).Select(_ => RandomString()); var users = new List<User>(); foreach (var fristName in fristNames)foreach (var LastName in LastNames) users.Add(new User($"{fristName} {LastName}")); users.ForEach(u => Console.WriteLine(u)); } private static object RandomString() { Random r = new Random(); return new string(Enumerable.Range(0, 10) .Select(i => (char)('a' + r.Next(26))).ToArray()); } }
示例2:享元
public class UserFlyWeight { static List<string> names = new List<string>(); private int[] indexs; public UserFlyWeight(string name) { int getNameIndex(string s) { if (names.IndexOf(s) == -1) { names.Add(s); return names.Count - 1; } else { return names.IndexOf(s); } } indexs = name.Split(' ').Select(getNameIndex).ToArray(); } public string FullName => string.Join(' ', indexs.Select(i => names[i]).ToArray()); } class Program { static void Main(string[] args) { var fristNames = Enumerable.Range(0, 100).Select(_ => RandomString()); var LastNames = Enumerable.Range(0, 100).Select(_ => RandomString()); { var users = new List<UserFlyWeight>(); foreach (var fristName in fristNames) foreach (var LastName in LastNames) users.Add(new UserFlyWeight($"{fristName} {LastName}")); users.ForEach(u => Console.WriteLine(u.FullName)); } } private static object RandomString() { Random r = new Random(); return new string(Enumerable.Range(0, 10) .Select(i => (char)('a' + r.Next(26))).ToArray()); } }
可以使用 Nuget通過記憶體單元進行測試:JetBrains.dotMemoryUnit
GC.Collect(); GC.WaitForPendingFinalizers(); dotMemory.Check(m =>Console.WriteLine(m.SizeInBytes));//[Test]測試下執行