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

我们继续学习设计模式系列文章

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

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

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

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

[任何设计模式都要求我们熟练掌握基本OOP的思想][王清培版权所有,转载请给出署名]

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

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

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

所谓非静态类:就是类只是一个定义,需要用类作为模板进行实例化出具体的实例对象,这个实例对象就是内存中的空间。实例对象的地址是不确定,所以静态对象无法直接访问非静态实例对象。[王清培版权所有,转载请给出署名]

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

1:

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

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

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

2:

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

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

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

3:

代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    public class Member
    {
        /// <summary>
        /// 将默认构造函数设置成私有的
        /// </summary>
        private Member() { }
        /// <summary>
        /// 保存对Member但实例的引用
        /// </summary>
        private static Member slignmemer;
        /// <summary>
        /// 统一获取Member对象的全局方法
        /// </summary>
        /// <returns></returns>
        public static Member GetMember()
        {
            if (slignmemer == null)
            {
                slignmemer = new Member();
                return slignmemer;
            }
            return slignmemer;
        }
        public int age;
        public int sex;
        public int scode;
    }
}

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

时间: 2024-10-25 20:36:16

.NET简谈设计模式之(单件模式)的相关文章

.NET简谈设计模式之(工厂模式)

文章开头本人申明一点,本人写的文章力求让看的人能理解精髓而不是专业化,博客园的好多人在写文章的时候总想着怎么怎么专业化,巴不得看的人都看不懂才能体现出他的技术,他的牛B,技术不是用来显威风用的,在你掌握了某种技术的时候,不要想着横扫博客园之类的思想,有点技术就开始浮躁连说话都开始像李莲英:我不是想这样攻击别人,在技术的这条路上大家能平易近人互相学习,以交流技术为主,不要想着看别人的文章就是在挑刺,想法设法打击别人的信心,人无完人,人外有人,山外有山,各有所长,大家互补才能真正使我们国家的软件实力

.NET简谈设计模式之(策略模式)

策略模式在我们日常开发中经常被用到,这篇文章不是策略模式的深入讨论和学术研究,只是让初学者能有个基本的了解. 什么叫策略:1. 可以实现目标的方案集合:2. 根据形势发展而制定的行动方针和斗争方法:3. 有斗争艺术,能注意方式方法. 什么叫模式:模式(Pattern)其实就是解决某一类问题的方法论.把解决某类问题的方法总结归纳到理论高度,那就是模式.模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果.而且会得到解决问题的最佳办法. 什么叫策略

.NET简谈设计模式之(命令模式)

我们继续学习设计模式系列文章. 本篇要讲的是命令模式,其实命令模式也比较好理解,没有用到多高深的技术,也不需要多复杂的抽象.只需要我们脑海里能有一个大概的原型,等我们遇见类似问题的时候我们能通过巧妙的方式来解决.我们做应用层开发的大部分接触的都是一些模式.框架.思想等等,不像搞低层开发的,他们研究的可能多数是一些技术实现的问题,而我们是学习实现的方法论.应用层开发在技术的复杂程度上是有限的,在组合技术的实现上是复杂的.所以有一些.NET架构师确实比较厉害,他们能很早的就料到会出现什么问题,他们有

.NET简谈构件系统开发模式

在本人的".NET简谈插件系统开发模式"一文中我们详细介绍了插件系统开发模式的优越性,尽管.NET平台或者第三方提供的平台都为我们实现了底层插件原理模型,我们可以在上面进行开发,作为一名有求知欲的程序员才是一名合格的程序员:我们不能满足系统为我们提供的功能,我们要向下沉,沉的越深越好,躲开那些应用变化给我们带来的劳累感,所以我们是否需要掌握一些别人不会的技术,才能让我们在众多的程序员中脱颖而出呢:[王清培版权所有,转载请给出署名] 我们今天来探讨"构件"系统开发模式

.NET设计模式:单件模式(Singleton Pattern)

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

艾伟_转载:.NET设计模式:单件模式(Singleton Pattern)

概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任. 从另一个角度来说,Singleton模式其实也是一种职责型模式.因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责! 意图

php设计模式总结-单件模式

一.单件模式 英文叫做sington.其他语言中有叫做单例模式,其实都是一样的道理.保证只会出现单个实例,所以是单例.翻译成单件,永远只会产生一件,呵呵. 还有翻译成单元素模式.其实关键是看这个英文比较好.英文是sington,统一是使用这个单词. 单件模式的目的我理解如下: 避免重复创建(实例化)对象,已经有现成的实例就用现成的. 减少资源的浪费(因为创建多个实例,浪费内存,完全没必要),单件模式保证了每时每刻引用的都是同一个实例. 为什么同时创建多个实例会引起逻辑上的错误呢? $obj1$o

设计模式之单件模式(Singleton Pattern )

设计 单件模式 Singleton Pattern Singleton 模式,它包含在创造性模式系列中. 创造性模式指示如何以及何时创建对象.Singleton 模式可以保证一个类有且只有一个实例,并提供一个访问它的全局访问点.在程序设计过程中,有很多情况需要确保一个类只能有一个实例.例如,系统中只能有一个窗口管理器.一个打印假脱机,或者一个数据引擎的访问点.PC机中可能有几个串口,但只能有一个COM1实例. 其结构如下: 我们可以定义一个Spooler类,实现Singleton 模式 Publ

PHP设计模式介绍Ⅳ单件模式

  几乎所有面向对象的程序中,总有一两个资源被创建出来,在程序应用中持续被共享使用.例如,这样的一个资源,在一个电子商务程序的数据库连接中使用:这个连接在应用程序启动时初始化,程序于是可以有效的执行;当程序结束时,这个连接最终被断开并销毁.如果是你写的代码,没必要在每时每刻创建一个数据库连接,这样非常低效.已经建立好的连接应该能被你的代码简单重复的使用.这个问题就是,基于以上要求你将如何进行这个数据库连接?(或者连接其它被循环使用的唯一资源,比如一个开放文件或者一个队列.) 问题 你怎样确保一个