.NET简谈设计模式之(单件模式)

发表于:2011-8-04 09:51

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangqingpei557    来源:51Testing软件测试网采编

  今天要讲的是单件模式,其实单件模式是比较简单的设计模式,在我们日常开发过程中也是经常用到的。

  单件模式:单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法。

  我想如果初学者对一些基本概念能熟练掌握时,其实单件模式是很简单的,就是因为初学者对一些概念还不是很理解,我们先来扫除这些阻挡我们理解的障碍。

  大部分的初学者都会搞不清楚“静态对象”与“实例对象”的区别。当然谁都有一个过渡期,不要急慢慢来,只要我们心平气和的去学习就已经在走向成功的路上。

  [任何设计模式都要求我们熟练掌握基本OOP的思想]

  只有我们熟练的掌握了面向对象语言的基本语法、概念和一些面向对象的思想之后,我们才能对设计模式进行讨论、研究、编写。如果我们对面向对象语言的使用都还成问题时,再去学习设计模式恐怕心有余而力不足了。当然谁也不敢保证能精通一门语言的所有语法,但是我们必须保持一颗积极学习的心态,日积月累总能学了大差不离的。

  障碍:静态类与非静态类的区别

  所谓静态类,就是这个类在程序的上下文中是静态的,不会随着一些垃圾回收、堆栈调整而变动地址。所以实例对象才能随时的访问静态对象。静态类的初始化工作是不确定,一般在第一次调用静态类的对象时执行。

  所谓非静态类:就是类只是一个定义,需要用类作为模板进行实例化出具体的实例对象,这个实例对象就是内存中的空间。实例对象的地址是不确定,所以静态对象无法直接访问非静态实例对象。

  我想上面的两句话对初学者来说可能还是不能起到理解作用,我们还是来画个图比较形象。

  Member是实例类,没有static关键字修饰。这样引发出两个问题:1.为什么在实例类中可以包含静态对象?2.为什么在静态类中不能包含实例对象?

  其实这两者并不矛盾,我们想一想实例类是可以被实例化的,我们想用的时候就NEW一个出来,但是静态类在程序的内中是静态的,它一旦被初始化就确定了内存位置,所以不管实例对象有多少个不确定的位置,但是静态对象的位置是确定的,那么实例程序员当然是在随处都可以访问静态对象的。

  但是反过来静态对象是不能够包含实例成员的,因为实例成员不确定位置,所以静态类是找不到实例对象的内存地址的。你也许还会问,那么为什么我在实例类中可以定义两种类型的对象,一种实例成员,一种静态成员。我们都知道在程序中是不能够存在两个相同名称的类的,其实我们完全可以将上图的一个类分解成两个类,一个静态和一个非静态。这样也能够实现相同的效果,但是这样似乎不能满足我们的日常面向对象的开发。在日常生活中,就是有这种情况存在的,好比我有个模板可以往这个模板中倒入石膏形成一定的模型实体,石膏跟实体本来就是类与实例的关系,但是有些东西是每个石膏所公用的信息,比如每个实体都有一个出自哪个模板的编号,所以每个实体都必须要引用这个模板。通过这个引用编号,就能找到模板。

  虽然是一个Member类,但是我们在使用的时候却是两中对象,这两种对象都是从Member中动态分离出来的。只要我们搞懂这个问题,对理解单件模式就简单多了。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号