当前位置: 首页 > news >正文

Unity(五):使用场景Ⅱ:用于单例模式

单例模式

  有关单例模式本身,我想就不用我在这里多说了,它可以说是模式中最简单的一个了。我只是想谈谈我对这个模式的一点想法。

  为了实现单例模式,我们通常的做法是,在类中定义一个方法如GetInstance,判断如果实例为null则新建一个实例,否则就返回已有实例。但是我觉得这种做法将对象的生命周期管理与类本身耦合在了一起,与SRP原则相违背。所以我觉得遇到需要使用单例的地方,应该将生命周期管理的职责转移到对象容器上,而我们的类依然是一个干净的类。

  为了接下来的说明,我们先编写几个后面需要的接口和类:准备工作

  IOrder接口、CommonOrder类、VipOrder类:

Unity(五):使用场景Ⅱ:用于单例模式

Unity(五):使用场景Ⅱ:用于单例模式

Unity(五):使用场景Ⅱ:用于单例模式

  将Unity应用于单例模式,主要有两种使用场景:

  (1)将类型注册为单例;

  (2)将已有对象注册为单例。

  将类型注册为单例

  与上一篇文章建立类型映射类似,我们可以将一个接口注册为标识键,对应一个具体类。不同的是,要用于单例模式,我们需要使用一个LifetimeManager类型的参数,并指定为ContainerControlledLifetimeManager类型:

  ReGISterType<TFrom, TTo>(new ContainerControlledLifetimeManager())

  以下的代码以接口注册为例,演示了如何为一个接口注册一个具体类,并声明为单例:

Unity(五):使用场景Ⅱ:用于单例模式

Unity(五):使用场景Ⅱ:用于单例模式

  同样,我们可以为一个基类注册一个具体类,与前述的类似,如:container.RegisterType<Order, CommonOrder>(new ContainerControlledLifetimeManager());我们还可以把某个类直接注册为单例,而不进行类型的映射,如:container.RegisterType<CommonOrder>(new ContainerControlledLifetimeManager());

  这里需要指出的是:默认情况下,直接使用RegisterType(不指定LifetimeManager),然后Resolve所得到的对象的生命周期是短暂的,容器并不保存对象的引用,每次调用Resolve方法我们都会得到一个新对象。然而,当我们指定了ContainerControlledLifetimeManager参数后,容器在第一次调用Resolve方法时会创建一个新对象,此后在每次调用Resolve时,都会返回之前创建的对象。

  除此之外,Unity还扩展了单例的使用方式。例如,我需要把某个类设计为单例,但是发现在应用中我们需要这个类的两个单例,分别有不同的用途,这时,使用Unity的类型与名称组合的标识键,就可以满足这种使用场景。使用方式如下(以接口为例):

Unity(五):使用场景Ⅱ:用于单例模式

  ps:使用类型与名称的组合的例子可以参见前面一篇文章,大致相同。

  同理,我们也可以用基类和名称的组合为标识键注册具体类,还可以直接把某个类和名称组合进行注册。这里不再赘述。

  将已有对象注册为单例

  如果我们已经创建了一个对象,并希望使用已创建的对象作为单例,而不是由容器新创建一个对象,那么我们应该使用RegisterInstance方法。以下的代码以接口注册为例,演示了如何使用一个已有对象,为一个接口注册一个具体类,并声明为单例:

Unity(五):使用场景Ⅱ:用于单例模式

Unity(五):使用场景Ⅱ:用于单例模式

  将已有对象注册为单例,同样也支持前面提到的几种使用方式,如注册基类、使用名称等,也就不再重复了。

转载于:https://www.cnblogs.com/wukong0214/archive/2013/01/21/2870291.html

相关文章:

  • 【ZZ】9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
  • 密码绑定至密码文本框中
  • 使用PowerDesigner建立数据库模型
  • outerHTML兼容方法(jquery)
  • 解决compilation debug=true targetFramework=4.0 问题
  • Python学习笔记《Python核心编程》第13章 面向对象编程
  • GDI+ 图片高亮处理
  • int 反射到未知的 Enum , 使用 Enum.ToObject
  • USACO 3.1.1 Agri-Net
  • 关于SharePoint 2010 SP1
  • IE6,7下LI浮动不能自动换行,最后一行被隐藏掉解决办法
  • win7 64位注册表操作兼容问题解决(vc6)
  • 没有安装或未能初始化关联的源代码管理插件
  • 3DMAX与MAYA的区别
  • MyEclipse8.5更改默认的工作空间workspace
  • [deviceone开发]-do_Webview的基本示例
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 03Go 类型总结
  • JS+CSS实现数字滚动
  • Otto开发初探——微服务依赖管理新利器
  • Unix命令
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端技术周刊 2019-01-14:客户端存储
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么软件可以剪辑音乐?
  • 数据结构java版之冒泡排序及优化
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (10)STL算法之搜索(二) 二分查找
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)事件处理——(7)简单事件(Simple events)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (算法)求1到1亿间的质数或素数
  • (一)u-boot-nand.bin的下载
  • (译) 函数式 JS #1:简介
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .Net 垃圾回收机制原理(二)
  • .net6Api后台+uniapp导出Excel
  • .net流程开发平台的一些难点(1)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • :中兴通讯为何成功
  • @Bean注解详解
  • @property括号内属性讲解
  • [ Linux ] Linux信号概述 信号的产生
  • [Android] Android ActivityManager