【C#】单例模式<机房重构>

前言

在机房重构之前。我们学习了设计模式。在这次重构中,我们的任务就是将这些模式,加入到机房的重构中去。

如今先来解决一个最简单的问题——窗口的超生。

假设不加以限制,结果会是这样:

很的不友好。那么我们怎样来解决问题呢?——单例模式。

单例模式

通常我们能够让一个全局变量使得一个对象被訪问,但他不能防止你实例化多个对象,一个最好的办法就是,让类自身保存它的唯一实例,这个类能够保证没有其它实例能够被创建。而且它能够提供一个訪问该实例的方法。

用法

在这里有两种理解。一种正确的一种错误的。

第一种

首先把声明放到类的全局变量中。然后写一个推断是否实例化过的方法,当须要该窗口显示时,调用该方法。代码例如以下:(注冊)

private frmRegister fr;//声明全局变量

private void btnRegister_Click(Object sender,EventArgs e)
{
    openRegister();
}

private void openRegister()//推断方法
{
    if (ftb==null || ftb.IsDisposed)
    {
        ftb =new  FormToolbox();
        ftb.MdiParent = this;
        ftb.Show();
    }
}

非常显然,这是一种面向过程的思维。窗口有没有被实例化,须要主窗口去推断,我们须要的是面向对象的思想。所以。这尽管能够实现单例模式的功能。但却不是单例模式。

另外一种

相同,须要声明静态类变量。可是这次是在子窗口中声明的。然后构造一个私有的方法,外部代码就不能通过new来实例化它。也就是说仅仅有该窗口才有资格实例化,最后在该类中写静态方法。代码例如以下:

Public partial class frmRegister:Form
{
    private static frmRegister fr=null;//<span style="font-size:18px;">声明静态类变量</span>

    private frmRegister()//<span style="font-size:18px;">构造一个私有的方法</span>
    {
        InitializeComponent();
    }

    public static frmRegister GetInstance()//静态的类方法,返回值就是该类的实例
    {
        if (fr == null || fr.IsDisposed)
        {
            fr = new frmRegister();
            fr.MdiParent = MDIfrmMain.ActiveForm;
        }
        return fr;
    }
}
    

这样,我们在client调用时。仅仅须要写:frmRegister.GetInstance().Show();就能够了。client不用做不论什么工作,仅仅是在须要的时候调用一下方法就能够了。并且外部不能通过new来实例化这个窗口。由于这个窗口仅仅有一个实例化,被这个类自己保存着。

调用方法时类会推断有没有被实例化过,假设没有。则实例化一个返回,假设有,则直接返回。

机房中的单例模式

尽管第一种方法不符合面向对象。可是我为什么要写它呢?这就和我的机房有点关系。大家都知道,机房收费系统的主界面有一张图片。这就须要一个转换容器的api函数去做对应的转换,这样一来。单例模式在实际中的应用就要多点东西,也就是在每个子窗口上都加上引用。然后在每个窗口中去做调换,我觉得这是相当麻烦而且也不是一个好办法,所以。在重复比較下,我选择了之前相对错误的做法。将推断的权利交给主窗口。

总结

一个模式的应用并非死板的,在对的时候用对的模式,不拘泥于模式的格式,如何使系统做起来更简单,更好用。就如何做,活学活用,才是我们学习设计模式的目的。

时间: 2024-10-21 14:09:50

【C#】单例模式&lt;机房重构&gt;的相关文章

机房重构---MDI窗体+单例模式

在VB6.0版本的机房收费系统中就用到了MDI技术(多文档界面),其中有的窗体用了MDI,而有的则没有用到,回头想想这些个关于增删改查的功能都该是MDI这个容器中的子窗体,于是这次我将他们都放到了MDI窗体中. 一.关于MDI窗体 MDI窗体设置步骤: (1)在frmMain中打开属性窗格,"IsMdiContainer"属性设置为"True". (2)把工具箱中MenuStrip控件拖到frmMain中,创建菜单如图 由于最近敲的是"修改密码"

[机房重构]UML图(包图、类图、用例图、时序图)

机房重构画图是一个非常重要的一个阶段,机房重构之前也画过UML的图,但是这一次与上一次不同,这一次有分层的思想在里面. 包图 之前三层的时候各层之间的传递很清晰,包图也很容易就画出来了,先来看之前三层的包图.通过实体将输入的信息从U层传入B层,同时通过实体将信息从D层传入B层,B层进行判断,通过实体将结果返回给U层. 之前的三层不能很好的实现低耦和的思想,并且我们学习了设计模式,要继续进行分层,进行七层的编写.之前不太理解,看大家的博客,知道在U层和B层之间加入了外观模式,降低U层和B层之间的耦

机房重构-完结篇

机房重构已经结束了,自从软考开始,光顾着准备软考和三级网络等级考试就没来得急总结.软考一开始,突然觉得时间好少,时间过得好快.这节奏,有点飕飕的. ---------------------技术总结: 熟悉了对Visual Studio这一开发环境的使用,深入了解了VB.net语言基础有了一定的认识并且学会使用.这一次使用三层架构,利用分分层的思想,深入理解了各层的职责.代码规范,这一次再敲代码的时候先学了一下代码规范,也把头文件注释设计好,让自己的代码漂亮一点. 最终的要思想还是面向对象,根据

【机房重构】—上机&amp;订餐

前几天通过UML图中的时序图,让我对于机房重构中的每一条线理解的更加清晰,以前觉得上机特别的乱,在一次偶遇中,得知了原来它可以转化成我们平时订餐,下面就听我说一说上机&订餐的故事吧! 又是发生在一个风和日丽的早上(廊坊师范学院时间:11:30),其实对于大多数人来说应该是中午了吧,睁开朦胧的睡眼,拿起手机看了看Time,到了吃饭的时间了,由于昨天晚上一直整理自己的机房收费系统上机部分,到很晚才睡,朦胧记得我最后"搞"成功了!为了庆祝我昨天的战果于是果断在美图团网上订了一份排骨盖

机房重构 之 SqlHelper

机房收费开始一段时间了,刚开始也是敲了一段时间,发现D层访问数据库出现了大量的重复代码,每个D层类都要 单独访问数据库.发现问题,咱们就解决问题,查阅前人的博客,发现了一个SqlHelper类,运用一下,果然好用,省 去了大量时间去写重复的代码. 小面对SQL中的一些类方法进行简单的介绍. 1.SQLHelper.ExecuteNonQuery    作用:用于执行语句 2. SQLHelper.ExecuteScalar       作用:用于获取单字段值语句 3. SQLHelper.Exe

机房重构(3)——存储过程

在敲机房收费过程中我们都会遇到这样的问题:很多功能实现都需要涉及到多张表的操作,比如充值.退卡.结账等功能的实现.这就需要我们多次对数据库进行操作,不仅代码量大大增加,而且执行效率也会大打折扣.为了提高效率,于是,存储过程就华丽登场了. 1.简介 存储过程是一组为了完成特定功能的语句集,经过编译后存储在数据库中,用户通过制定存储过程的名称并给出参数来执行它.存储过程在运算时生成执行方式并存储在数据库当中,当其再次运行时速度比单个的SQL语句要快.    2.优缺点 1)优点 a.复用性强.存储过

机房重构——视图

视图.存储过程.触发器等等早就听说过,却没有真正接触过,一直处在一个以后再说的状态中,逃是逃不掉了. 机房重构,重构出了什么?留着这个疑问.重构完以后再做总结. 视图:在SQL中,外模式一级数据结构的基本单位是视图,就是从若干个基本表和(或)其他视图构造出来的表.其实就是一张虚表. 注意:在使用视图的时候,应当提前设置好关联表的主外键. 在机房收费系统里功能之一,学生查看余额时,用到了两张表的内容,Card表里的状态和余额,其他信息都来自学生表. 视图的创建和删除: 方法一:使用SQL语句创建视

机房重构包图(从三层+实体到三层+实体+外观+工厂+接口+SQLHelper)

刚刚开始接触三层的时候,我只做了两个登录小窗体的例子.画了简单的包图,可以说,为后面机房重构留下了大量的工作(因为三层理解没有深度,也没有理解出自己的东西).不过,欠下的总要还的.在做机房重构的时候,问题出现了.如果只用三层+实体,我能做出来,但是,要求重构不能只用三层+实体,那么,就要好好分析一下了. 首先说说三层+实体:就是表现层(U层)直接调用业务逻辑层(B层)的逻辑,业务逻辑层在直接访问数据层(D层),在把数据返回到B层后返回到U层.首先,只用三层+实体做程序时,灵活性不够高.如果想换数

机房重构时利用状态模式实现消费时间的计算

在做机房重构时,我们会在学生上下机计算学生上机时间时,会出现消费时间随着基本数据设定表中的数据变化而变化,这里不仅仅是数据的变化,还包括不同时间段内消费时间具体确定问题.主要分为三个时间段的计算 1.准备时间:即在此时间段内,消费金额为0 2.至少上机时间:如果上机时间超过了准备时间,但是少于至少上机时间,那么此时消费时间为至少上机时间 3.按正常消费时间来算:此时,消费时间大于至少上机时间后,则按照正常时间来算 通过对业务的分析,我们发现在不同时间段,最终的消费时间的计算方式是不一样的.如果我