c#单例模式(Singleton)的6种实现(3)

电脑杂谈  发布时间:2019-04-18 12:08:42  来源:网络整理

我相信大家都可以得到答案,如果在调用EchoAndReturn()方法之前,需要完成静态成员的初始化,所以最终的输出结果如下:

图5输出结果

接着我们在Main()方法中添加string y = Test.x,如下:

图6 输出结果

通过上面的输出结果,大家可以发现静态字段的初始化跑到了静态方法调用之前,Wo难以想象啊!

最后我们在Test类中添加一个静态构造函数如下:

图7 输出结果

理论上,type initializer应该发生在”Echo!”之后和”After echo”之前,但这里却出现了不唯一的结果,只有当Test类包含静态构造函数时,才能确保type initializer的初始化发生在”Echo!”之后和”After echo”之前。

前一篇文章我们讲述了preference家族的基类(接下来我们所要介绍的其他子类preference一定是继承了他的所有属性也可以理解成都是在继承他所展示的ui效果及交互功能的基础上升级的)而且preference可以实例化,那么我们就可以把他看成对应的一个组件,其实和我们熟悉的textview一样,所以我们需要使用的时候第一步肯定是先得到他的对象——而构造对象我们都可以通过两种方式:通过其对应的构造方法或者其他方法和通过xml映射(或许说法不够准确),接着第二步preferenceactivity的初始化,再接着根据业务设置相关。接下来我们用到读内存的函数,第一个参数是刚刚的句柄,第一句的第二个是静态地址,转换成十进制,。补充:java语言规范还规定了触发初始化的情况,如当类的实例被创建时,类声明的静态方法被调用,类或接口的静态字段被复制,声明的静态非常量字段被使用,当类是顶级类时且断言语句嵌套在类中被执行时。

静态初始化

以上方式实现比之前介绍的方式都要简单,但它确实是多线程环境下,C#实现的Singleton的一种方式。由于这种静态初始化的方式是在自己的字段被引用时才会实例化。

让我们通过IL代码来分析静态初始化。

图8静态初始化IL代码

首先这里没有beforefieldinit的修饰符,由于我们添加了静态构造函数当静态字段被引用时才进行初始化,因此即便很多线程试图引用_instance,也需要等静态构造函数执行完并把静态成员_instance实例化之后可以使用。

延迟初始化

这里我们把初始化工作放到Nested类中的一个静态成员来完成,这样就实现了延迟初始化。

Lazy<T> type

在创建扩展组时系统会提供这样一个配置选项,大家能够指定是否使用标准的ec2检查机制(当该实例接入网络时),或者使用自己的elb运行状态检查机制。多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。

具体例子

现在大多数linux服务器使用10/100mb以太网。在过去的7届旅游节中,我们举办了宁波国际旅游展,创新引入b2c模式,实现旅游产品购销互动、现场交易和旅游线路特惠特卖,在甬城刮起了一阵平价旅游风暴。

由于负载平衡器只提供一个对象实例供服务器使用,所以我们使用单例模式(Singleton)实现该负载平衡器。

上面负载平衡器类LoadBalancer我们使用静态初始化方式实现单例模式(Singleton)。

图9 LoadBalancer输出结果

1.1.3 总结

单例模式的优点:

单例模式(Singleton)会控制其实例对象的数量,从而确保访问对象的唯一性。

1.实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-93858-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 司马图
      司马图

      其实我是不高兴在美丽的夕阳下遇到你

    热点图片
    拼命载入中...