设计模式_创建型模式_单例模式_案例

Posted fzxiaoyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式_创建型模式_单例模式_案例相关的知识,希望对你有一定的参考价值。

转载自:http://blog.csdn.net/lovelion  作者:刘伟

负载均衡器的设计与实现

技术分享图片

 

Sunny公司开发人员通过分析和权衡,决定使用单例模式来设计该负载均衡器,结构图如图3-3所示:

技术分享图片

在图中,将负载均衡器LoadBalancer设计为单例类,其中包含一个存储服务器信息的集合serverList,

每次在serverList中随机选择一台服务器来响应客户端的请求,实现代码如下所示:

LoadBalance:

 1 namespace SingletonPattern
 2 {
 3     /// <summary>
 4     /// 负载均衡器器(单例模式)
 5     /// </summary>
 6     public class LoadBalance
 7     {
 8         private static LoadBalance _instance = null; //保存当前类的唯一实例
 9         private List<String> ServerList = null; //服务器列表
10 
11         private LoadBalance()
12         {
13             ServerList = new List<string>();
14         }
15         //供外部调用,用于返回当前类的唯一实例
16         public static LoadBalance GetInstance()
17         {
18             if (_instance == null)
19             {
20                 _instance = new LoadBalance();
21             }
22             return _instance;
23         }
24 
25         //增加服务器
26         public void AddServer(string server)
27         {
28             ServerList.Add(server);
29         }
30 
31         //删除服务器
32         public void RemoveServer(string server)
33         {
34             ServerList.Remove(server);
35         }
36         //随机获取一个服务器,来实现负载均衡器
37         public String GetRandomServer()
38         {
39             if (ServerList.Count > 0)
40             {
41                 //使用随机数时,需要进行沿时,否则容易产生随机生成一堆相同的数据
42                 Thread.Sleep(10);
43                 Random random = new Random();
44                 int index = random.Next(0, ServerList.Count);
45                 return ServerList[index];
46             }
47             return null;
48         } 
49     }
50 }

Program:

 1 namespace SingletonPattern
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             //实例化四个对象进行测试
 8             LoadBalance balance1, balance2, balance3, balance4;
 9             balance1 = LoadBalance.GetInstance();
10             balance2 = LoadBalance.GetInstance();
11             balance3 = LoadBalance.GetInstance();
12             balance4 = LoadBalance.GetInstance();
13 
14             //判断下这四个对象是否是同一个对象?
15             //如果不相同,就违法了单例模式
16             //相同的话,就符合单例模式
17             if(balance1.Equals(balance2) || balance1.Equals(balance3) || balance1.Equals(balance4))
18                 Console.WriteLine("对象1与所有对象都相同,符合单例模式");
19             else
20                 Console.WriteLine("对象1与其它对象不相同,不符合单例模式");
21             
22             //增加服务器
23             balance1.AddServer("服务器1:127.0.0.1");
24             balance1.AddServer("服务器2:222,222,222,222");
25             balance1.AddServer("服务器3:333,333,333,333");
26             balance1.AddServer("服务器4:444,444,444,444");
27 
28             //模拟客户端请求的分发,随机获取一个服务器
29             for (int i = 0; i < 10; i++)
30             {
31                 Console.WriteLine("分发请求:" + balance1.GetRandomServer());
32             }
33             Console.Read();
34         }
35     }
36 }

输出结果:

技术分享图片

 

以上是关于设计模式_创建型模式_单例模式_案例的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_7种单例模式实现

设计模式 - 创建型模式_7种单例模式实现

python设计模式---创建型之单例模式

4创建型模式之单例模式__多线程下的懒汉式单例和饿汉式单例

设计模式_创建型模式_简单工厂模式_案例

设计模式_单例模式