singletonrealworld.cs

来自「使用C#程序将23个常用设计模式进行列表显示」· CS 代码 · 共 91 行

CS
91
字号
using System;
using System.Windows.Forms;
using System.Collections;

//单件模式(Singleton)
//意图
//    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
//适用性
//    1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
//    2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

namespace DesignPattern.SingletonRealWorld
{
    class SingletonRealWorld : AbstractPattern
    {
        public static void Run(TextBox tbInfo)
        {
            s_tbInfo = tbInfo;
            s_tbInfo.Text = "";

            LoadBalancer b1 = LoadBalancer.GetLoadBalancer();
            LoadBalancer b2 = LoadBalancer.GetLoadBalancer();
            LoadBalancer b3 = LoadBalancer.GetLoadBalancer();
            LoadBalancer b4 = LoadBalancer.GetLoadBalancer();
            // Same instance? 
            if (b1 == b2 && b2 == b3 && b3 == b4)
            {
                DesignPattern.FormMain.OutputInfo("Same instance\n");
            }
            // All are the same instance -- use b1 arbitrarily 
            // Load balance 15 server requests 

            for (int i = 0; i < 15; i++)
            {
                DesignPattern.FormMain.OutputInfo(b1.Server);
            }
            // Wait for user 
            ////Console.Read();

        }
    }

    class LoadBalancer
    {
        private static LoadBalancer instance;
        private ArrayList servers = new ArrayList();
        private Random random = new Random();
        // Lock synchronization object 
        private static object syncLock = new object();

        // Constructor (protected) 
        protected LoadBalancer()
        {
            // List of available servers 
            servers.Add("ServerI");
            servers.Add("ServerII");
            servers.Add("ServerIII");
            servers.Add("ServerIV");
            servers.Add("ServerV");
        }

        public static LoadBalancer GetLoadBalancer()
        {
            // Support multi threaded applications through 
            // 'Double checked locking' pattern which (once 
            // the instance exists) avoids locking each 
            // time the method is invoked 
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null)
                    {
                        instance = new LoadBalancer();
                    }
                }
            }
            return instance;
        }
        // Simple, but effective random load balancer 
        public string Server
        {
            get
            {
                int r = random.Next(servers.Count);
                return servers[r].ToString();
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?