大家好,接着上一篇文章,我们继续了解单例模式的扩展功能以及一些注意的事项!
上一篇我们说道,当为懒汉式单例模式的时候,可能存在线程并发导致实例出现多个的问题,这个问题,在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
学习是一件快乐的事情,让我们一起加油!
时间: 2024-09-29 06:05:26