程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 設計模式之單例模式,設計模式之模式

設計模式之單例模式,設計模式之模式

編輯:關於.NET

設計模式之單例模式,設計模式之模式


1、類圖

實例圖

2、創建項目

………………………………

3、 新建周報類LoadBalancer:負載均衡器類,充當單例角色,在真實環境下該類非常復雜,包括大量初始化的工作和業務方法,考慮到代碼的可讀性和易理解性,在此只列出部分與模式相關的核心代碼。

using System;

using System.Collections;

using System.Threading;

namespace SingletonSample

{

    class LoadBalancer

    {

        //私有靜態成員變量,存儲唯一實例

        private static LoadBalancer instance = null;

        //服務器集合

        private ArrayList serverList = null;

 

        //私有構造函數

        private LoadBalancer()

        {

            serverList = new ArrayList();

        }

        //公有靜態成員方法,返回唯一實例

        public static LoadBalancer GetLoadBalancer()

        {

            if (instance == null)

            {

                instance = new LoadBalancer();

            }

            return instance;

        }

        //增加服務器

        public void AddServer(string server)

        {

            serverList.Add(server);

        }

        //刪除服務器

        public void RemoveServer(string server)

        {

            serverList.Remove(server);

        }

        //使用Random類隨機獲取服務器

        public string GetServer()

        {

            Random random = new Random();

            Thread.Sleep(10); //適度的線程等待可以保證隨機數生成的不是上一次的結果

            int i = random.Next(serverList.Count);

            return serverList[i].ToString();

        }

    }

}

4、 新建Singleton類:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace SingletonSample

{

    public class Singleton

    {

        private static Singleton _singleton = null; //定義私有的靜態成員變量——唯一的實例對象

 

        /// <summary>

        /// 定義私有的構造函數,防止被外界實例化

        /// </summary>

        private Singleton()

        {

        }

        /// <summary>

        /// 定義公開的唯一的方位(工廠)方法,返回系統的唯一實例,實現自己創建自己

        /// </summary>

        /// <returns></returns>

        public static Singleton GetInstance()

        {

            if (_singleton == null)

                _singleton = new Singleton(); //如果為null,則實例化自己

            return _singleton;

        }

    }

}

 

5、 Program:客戶端測試類

using System;

namespace SingletonSample

{

    class Program

    {

        static void Main(string[] args)

        {

            #region 測試單例,比較是否是同一個實例

            Singleton singleton1 = Singleton.GetInstance(); //創建單例對象1

            Singleton singleton2 = Singleton.GetInstance(); //創建單例對象1

            if (singleton1 == singleton2)

            {

                Console.WriteLine("singleton1與singleton2為:同一實例。");

            }

            else

            {

                Console.WriteLine("singleton1與singleton2為:不是同一實例。");

            }

            Console.Read();

            #endregion

            #region 案例

            //創建四個LoadBalancer對象

       LoadBalancer balancer1,balancer2,balancer3,balancer4;

        balancer1 = LoadBalancer.GetLoadBalancer();

        balancer2 = LoadBalancer.GetLoadBalancer();

        balancer3 = LoadBalancer.GetLoadBalancer();

        balancer4 = LoadBalancer.GetLoadBalancer();

    //判斷服務器負載均衡器是否相同

    if (balancer1 == balancer2 && balancer2 == balancer3 && balancer3 == balancer4)

            {

    Console.WriteLine("服務器負載均衡器具有唯一性!");

    }

    //增加服務器

    balancer1.AddServer("Server 1");

    balancer1.AddServer("Server 2");

    balancer1.AddServer("Server 3");

    balancer1.AddServer("Server 4"); 

            //模擬客戶端請求的分發,如果輸出結果全為同一個server,可以將i適當放大,例如改為"i < 100"

           int num = 10;

            for (int i = 0; i < num; i++)

            {

                string server = balancer1.GetServer();

                Console.WriteLine("分發請求至服務器: " + server);

            }

            Console.Read();

            #endregion

        }

    }

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved