1. 程式人生 > 其它 >享元模式 Flyweight

享元模式 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]測試下執行