设计模式-单例模式扩展(程序员学习之路-架构之路)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-单例模式扩展(程序员学习之路-架构之路)相关的知识,希望对你有一定的参考价值。

   大家好,接着上一篇文章,我们继续了解单例模式的扩展功能以及一些注意的事项!

 

  上一篇我们说道,当为懒汉式单例模式的时候,可能存在线程并发导致实例出现多个的问题,这个问题,在Net中通过Lock加锁来实现,在Java中通过syncronized关键字来实现!由于这个代码特别简单,我们就不讨论了!

 

  今天我们要讨论的是,单例模式的扩展,也就是要求返回指定数量的实例,这个应该怎么实现呢?废话不多说,直接来代码分析!

 

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7 
 8 namespace designpattrns_SingleModelEx
 9 {
10 
11     /// <summary>
12     /// cto类负责产生CTO
13     /// </summary>
14 
15     public class cto
16     {
17         private static int maxnumofcto = 5; //申明返回的实例数量
18 
19         private static List<string> ctolistprop = new List<string>(); //每个cto都有自己的属性,因此用来存储每个对象私有属性
20 
21         private static List<cto> ctolist  //默认申请指定数量的CTO对象存储
22         {
23             get
24             {
25                 List<cto> ctolisttemp = new List<cto>();
26                 for (int i = 0; i < maxnumofcto; i++)
27                 {
28                     ctolisttemp.Add(new cto($"我是CTO,我的名字是{i}"));
29                 };
30                 return ctolisttemp;
31             }
32         }
33 
34         private static int countnumofcto = 0;//申明cto的的序列号,便于后边区分
35 
36         //不让用户程序员自己随便new对象,否则容易产生多个CTO 
37         //同时把生产指定数量的对象放入数组中
38         private cto()
39         {
40 
41         }
42 
43         /// <summary>
44         /// 用来存储CTO的姓名
45         /// </summary>
46         /// <param name="name"></param>
47         private cto(string name)
48         {
49             ctolistprop.Add(name);
50         }
51 
52 
53         /// <summary>
54         /// 单例模式的核心
55         /// </summary>
56         /// <returns></returns>
57         public static cto getInstance()
58         {
59             /*下面的核心从cto队列中随机返回一个CTO对象*/
60             Random random = new Random();
61             countnumofcto = random.Next(maxnumofcto);
62             return ctolist[countnumofcto];
63         }
64 
65 
66         public void Say()
67         {
68             Console.WriteLine($"我是公司的CTO{ctolistprop[countnumofcto]},你们的工作需要想问汇报!");
69         }
70     }
71 
72     class Program
73     {
74         static void Main(string[] args)
75         {
76             for (int j = 0; j < 10; j++)
77             {
78                 cto CTO = cto.getInstance(); //获取cto实例,并且每次返回都随机的
79                 Console.WriteLine($"第{j}次调用的对象为:");
80                 CTO.Say();
81                 Thread.Sleep(1000);//暂停目的,不暂停的话,在返回实例的时候有可能每次返回的都是同一个实例,因为时间间隔小的随机数生产可能相同
82             }
83         }
84     }
85 }

上面的代码清晰明了的说明了单例模式的扩展功能,返回指定数量的实例对象是对单例模式的一种扩展和增强,用来弥补单例模式可能存在的性能问题,有了上述的方法,我们可以自由决定对象在内存中的数量,相对于单例模式,提高了系统的响应速度!

好了以上就是我们今天要分享的单例模式的升级版本,下一章,我们继续分享下一个设计模式---工厂方法模式!

 

代码已上传至github了,代码地址:https://github.com/hyy829119/DesignPatterns.git

学习是一件快乐的事情,让我们一起加油!

 

  

以上是关于设计模式-单例模式扩展(程序员学习之路-架构之路)的主要内容,如果未能解决你的问题,请参考以下文章

php架构之路,phper进阶,学习路线

Codull 的逆袭之路——你还不会单例模式吗?

程序员羽化之路--我眼中的单例模式并不完美

[js高手之路]设计模式系列课程-单例模式实现模态框

python之路_flask框架_单例模式及session原理

python之路33开发模式单例模式