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

今天要讲的是单件模式,其实单件模式是比较简单的设计模式,在咱们平常开发过程当中也是常常用到的。程序员

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

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

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

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

只有咱们熟练的掌握了面向对象语言的基本语法、概念和一些面向对象的思想以后,咱们才能对设计模式进行讨论、研究、编写。若是咱们对面向对象语言的使用都还成问题时,再去学习设计模式恐怕爱莫能助了。固然谁也不敢保证能精通一门语言的全部语法,可是咱们必须保持一颗积极学习的心态,日积月累总能学了大差不离的。spa

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

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

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

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

1:

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

其实这二者并不矛盾,咱们想想实例类是能够被实例化的,咱们想用的时候就NEW一个出来,可是静态类在程序的内中是静态的,它一旦被初始化就肯定了内存位置,因此无论实例对象有多少个不肯定的位置,可是静态对象的位置是肯定的,那么实例程序员固然是在随处均可以访问静态对象的。

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

2:

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

咱们下面进入单件模式的学习。

其实单件模式就是运用混合类的方式进行解决的,要保证类只有一个实例。咱们顺着问题进行摸索,每一个实例类均可以经过调用构造函数进行实例化具体对象,那么是否是不可以将这实例类的构造函数公开啊?固然不能公开了。咱们要经过一个静态成员对实例对象保持整个生命周期的引用,当下次谁须要这个实例对象的时候咱们将读取静态成员中的引用,就能够获取到这惟一的实例了;

3:

代码:

  
  
  
  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     public class Member  
  8.     {  
  9.         /// <summary>  
  10.         /// 将默认构造函数设置成私有的  
  11.         /// </summary>  
  12.         private Member() { }  
  13.         /// <summary>  
  14.         /// 保存对Member但实例的引用  
  15.         /// </summary>  
  16.         private static Member slignmemer;  
  17.         /// <summary>  
  18.         /// 统一获取Member对象的全局方法  
  19.         /// </summary>  
  20.         /// <returns></returns>  
  21.         public static Member GetMember()  
  22.         {  
  23.             if (slignmemer == null)  
  24.             {  
  25.                 slignmemer = new Member();  
  26.                 return slignmemer;  
  27.             }  
  28.             return slignmemer;  
  29.         }  
  30.         public int age;  
  31.         public int sex;  
  32.         public int scode;  
  33.     }  
  34. }  

总结:单件模式就讲解完了,其实单件模式就是混合类的使用,只要咱们讲类的使用熟练了单件模式也就能理解了。

相关文章
相关标签/搜索