享元模式 Flyweight

用途:节约空间,共享单元

示例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]测试下运行

 

posted @ 2022-05-20 10:48  后跳  阅读(16)  评论(0编辑  收藏  举报