无废话C#设计模式之二:Singleton

转载 2011年01月17日 15:03:00

无废话C#设计模式之二:Singleton

 

意图

 

       保证一个类只有一个实例,并提供访问它的全局访问点。

 

场景

 

       我们现在要做一个网络游戏的服务端程序,需要考虑怎么样才能承载大量的用户。在做WEB程序的时候有各种负载均衡的方案,不管是通过硬件实现还是软件实现,基本的思想就是有一个统一的入口,然后由它来分配用户到各个服务器上去。

       需要考虑的问题是,即使在多线程的并发状态下,用户只能通过一个唯一的入口来分配,由此引入了Singleton模式来实现这个唯一的入口。

 

示例代码

  

using System;

using System.Collections.Generic;

using System.Threading;

 

namespace SingletonExample

{

    class Program

    {

        static void Main(string[] args)

        {

            ParameterizedThreadStart ts = new ParameterizedThreadStart(EnterPlayer);

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

            {               

                Thread t = new Thread(ts);

                t.Start("player" + i);

            }

 

            LoadBalanceServer.GetLoadBalanceServer().ShowServerInfo();

     

        }

 

        static void EnterPlayer(object playerName)

        {

            LoadBalanceServer lbs = LoadBalanceServer.GetLoadBalanceServer();

            lbs.GetLobbyServer().EnterPlayer(playerName.ToString());

        }

    }

 

    class LoadBalanceServer

    {

        private const int SERVER_COUNT = 3;

        private List<LobbyServer> serverList = new List<LobbyServer>();

 

        private static volatile LoadBalanceServer lbs;

        private static object syncLock = new object();

 

        private LoadBalanceServer()

        {

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

            {

                serverList.Add(new LobbyServer("LobbyServer" + i));

            }

        }

 

        public static LoadBalanceServer GetLoadBalanceServer()

        {

            if (lbs == null)

            {

                lock (syncLock)

                {

                    if (lbs == null)

                    {

                        Thread.Sleep(100);

                        lbs = new LoadBalanceServer();

                    }

                }

            }

            return lbs;

        }

 

        public LobbyServer GetLobbyServer()

        {

            LobbyServer ls = serverList[0];

            for (int i = 1; i < SERVER_COUNT; i++)

            {

                if (serverList[i].PlayerList.Count < ls.PlayerList.Count)

                    ls = serverList[i];

            }

            return ls;

        }

 

        public void ShowServerInfo()

        {

            foreach (LobbyServer ls in serverList)

            {

                Console.WriteLine("=================" + ls.ServerName + "=================");

                foreach (string player in ls.PlayerList)

                {

                    Console.WriteLine(player);

                }

            }

        }

    }

 

    class LobbyServer

    {

        private List<string> playerList = new List<string>();

 

        public List<string> PlayerList

        {

            get { return playerList; }

        }

 

        private string serverName;

 

        public string ServerName

        {

            get { return serverName; }

        }

 

        public LobbyServer(string serverName)

        {

            this.serverName = serverName;

        }

 

        public void EnterPlayer(string playerName)

        {

            playerList.Add(playerName);

        }

    }

}

 

 

代码执行结果如下图:

 

 

代码说明

 

l         LoadBalanceServer类实现了Singleton模式,也就是说无论在什么情况下,只会有一个LoadBalanceServer类的实例出现。

l         LobbyServer类表示大厅服务,用户进入大厅后和大厅服务进行服务,在这里我们仅仅在大厅服务里面保存了用户列表。

l         Singleton模式有很多实现方式,在这里使用的是双重锁定方式。对于C#来说,可能使用静态初始化方式是最简洁的,这里就不演示了。

l         LoadBalanceServer类的GetLobbyServer()方法负责返回一个压力最小的LobbyServer对象。

l         实例化LoadBalanceServer的时候Sleep了线程,目的是模拟高并发的情况,在正式代码中没有必要这样做。

 

何时采用

 

l         从代码角度来说,当你希望类只有一个实例的时候。

l         从应用角度来说,你希望有一个总管来负责某一件事情。并且这件事情的分配只能有一个人进行,如果有多个人进行肯定会弄乱。比如创建处理流水号如果有两个地方在创建的话是不是就会重复了呢?

 

实现要点

 

l         一个Singleton类,它能确保自身的实例是唯一的。

 

注意事项

 

l         不要滥用Singleton模式,只有非一个实例不可的情况下才考虑引入Singleton。否则,程序的可扩展性可能会受到限制。

设计模式之二 --- Singleton 模式 (java)

转载自http://blog.csdn.net/cjjky/article/details/7318506   【1】基本概念        Singleton 是一种创建性模式,它用来确保只产...
  • sada09
  • sada09
  • 2012年08月13日 10:19
  • 281

设计模式之二 --- Singleton 模式

【1】基本概念 Singleton 是一种创建性模式,它用来确保只产生一个实例,并提供一个访问它的全局访问点。对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接...

无废话C#设计模式之四:Factory Method

无废话C#设计模式之四:Factory Method 意图        定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 场景        上次,我们使用抽象工厂解决了生产一组产品的问...
  • rise51
  • rise51
  • 2011年01月18日 10:48
  • 225

无废话C#设计模式之十八:Command

无废话C#设计模式之十八:Command 意图        将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 场景        我...
  • rise51
  • rise51
  • 2011年01月18日 17:03
  • 262

无废话C#设计模式之一:开篇

无废话C#设计模式之一:开篇 什么是设计模式?        什么是少林拳呢?少林拳是少林僧人经过长期的总结,得出的一套武功套路。有一本叫做少林拳法的武功秘籍,上面记载这这套拳法的适用人群,打法套路和...
  • rise51
  • rise51
  • 2011年01月17日 15:02
  • 402

无废话C#设计模式之十五:Strategy

无废话C#设计模式之十五:Strategy 意图        定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可以独立于它的客户而变化。 场景        在开发程序...
  • rise51
  • rise51
  • 2011年01月18日 16:05
  • 212

无废话C#设计模式之十四:Template Method

无废话C#设计模式之十四:Template Method 意图        定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重...
  • rise51
  • rise51
  • 2011年01月18日 15:57
  • 177

无废话C#设计模式之十九:Observer

无废话C#设计模式之十九:Observer 意图        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 场景 这次不说游戏了,假设我...
  • rise51
  • rise51
  • 2011年01月18日 17:07
  • 272

无废话C#设计模式之二十二:总结(针对GOF23)

无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式常用程度适用层次引入时机结构复杂度Abstract Factory比较常用应用级设计时比较复杂Builder一般代码级编码时一般Fac...
  • rise51
  • rise51
  • 2011年01月18日 17:23
  • 275

无废话C#设计模式之十六:State

无废话C#设计模式之十六:State 意图        允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 场景        我们在制作一个网上书店的网站,用户在书店买了一定...
  • rise51
  • rise51
  • 2011年01月18日 16:18
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无废话C#设计模式之二:Singleton
举报原因:
原因补充:

(最多只允许输入30个字)