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

简介:

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

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

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

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

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

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

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

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

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

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

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. }  

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







 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/626310,如需转载请自行联系原作者



相关文章
|
5月前
|
设计模式 存储 安全
技术好文共享:设计模式笔记:单件模式(Singleton)
技术好文共享:设计模式笔记:单件模式(Singleton)
32 0
|
前端开发 .NET C#
ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程   ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Core 支持 MVC 开发模式,不知道大家对 MVC 设计模式是否了解,算了,不管了,本章节我们就来讲讲 MVC 设计模式吧。
2368 0
|
C# 设计模式 .NET
使用C# (.NET Core) 实现状态设计模式 (State Pattern)
本文的概念性内容来自深入浅出设计模式一书 项目需求 这是一个糖果机的需求图.  它有四种状态, 分别是图中的四个圆圈: No Quarter: 无硬币 Has Quater 有硬币 Gumball Sold 糖果卖出 Out of Gumball 没有糖果了 这个图很像一个状态图.
1873 0
|
C#
使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)
本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我们的设计已经足够好的时候, 新的需求来了, 我们不仅要支持多种菜单, 还要支持菜单下可以拥有子菜单.
1449 0
|
Java C# 设计模式
使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设计的, 这是第一份菜单: 这是第2份菜单: 同时有两个菜单存在的问题 问题就是多个菜单把事情变复杂了.
1028 0
|
C#
使用C# (.NET Core) 实现命令设计模式 (Command Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF).
847 0
|
Java C#
使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要它们的一个实例, 例如: 线程池,缓存, 弹出的对话框, 用于保存设置的类, 用于logging的类, 硬件设备驱动对象等等.
1213 0
|
C#
使用C# (.NET Core) 实现抽象工厂设计模式 (Abstract Pattern)
本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂.
1366 0
|
C# 设计模式 .NET
使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子.   前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是接口(interface).
1442 0
|
测试技术 API C#
[搬运]在C#使用.NET设计模式的新观点
原文地址:http://www.dotnetcurry.com/dotnet/1092/dotnet-design-patterns 软件开发有许多设计模式。其中一些模式非常受欢迎。说几乎所有的模式都可以被接受,而不管我们选择的编程语言如何。
1062 0
下一篇
无影云桌面