(C#设计模式一)Singleton(单态)

昨天看了LoveCherry的无废话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();
            Thread.Sleep(
90000);
        }

        
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();
        
        
public 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);
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值