开心网外挂开发之 Singleton 单件模式应用「建议收藏」

开心网外挂开发之 Singleton 单件模式应用「建议收藏」经过我们的努力,操作开心花园的各个底层功能我都开发出来了,我把所有的直接操作的功能都封装成一个KaiXinHelper类,通过这个类我们可以登录开心网,可以获得开心花园的所有信息,可以收获、播种、除草

大家好,又见面了,我是你们的朋友全栈君。

经过我们的努力,操作开心花园的各个底层功能我都开发出来了,我把所有的直接操作的功能都封装成一个KaiXinHelper类,通过这个类我们可以登录开心网,可以获得开心花园的所有信息,可以收获、播种、除草、除虫、浇水等等,把在所有对开心网直接的操作都集在这里了。

我们在写代码的时候发现,KaiXinHelper是我们整个程序的核心,所有的编程都是围绕它而来,登录模块要用它, 获取花园信息的模块要用它,对花园的所有操作也要用到它,但是它又是有状态的,就是除了登录以外的所有功能,都必须在确定登录好以后能能正常工作,所以KaiXinHelper就只能有一个实例,不然每次用其它功能而去login一下可不是什么好事,怎么能保证一个类只有一个实例呢?

我们知道所有的类实例化都是通过构造器来,当我们用new 来实例化对象的时候,会访问构造器里的代码来实例化,为了不让你码new 一个类,我们可以把构造器变为private,这样这个类就不能被new了,哪我们怎么实例化这个类呢, private下的代码在本类以外都不能实访问,我们可以让类里面实例化这个类吗、private下的代码在本类以内还果可以访问的

public static KaiXinHelper instance = null;
public static readonly object sysRoot=new object();

public static KaiXinHelper GetInstance()
{
    if (instance == null)
    {
        lock (sysRoot)
        {
            if(instance==null)
            {
                instance = new KaiXinHelper();
            }
        }
    }
    return instance;

}

这样我们在外面只要

this.khelper = KaiXinHelper.GetInstance();

这样我们就得到了这个类的实例。而且我们在访问GetInstance的时个判断过,instance是否为null,所以每次调用KaiXinHelper.GetInstance();都得到的是同一个实例,所以我们一次login以后,其状态一直是保存着的。

为什么我们还用到lock(sysRoot)这一行代码呢,

这是为了保证我们在多线程的情况下也保证KaiXinHelper只有一个实例。通过lock可以保证同一时间只有一个线程可以进入。

为什么要判断两次if(instance==null)

第一次的主要作用是因为lock的性能开销比较大,一但类实例化了以后,不用每次GetInstance()都要去访问lock的代码。

第二次的原因是,当类还有被实例化的时候,两个线程同时访问KaiXinHelper.GetInstance();这样都都可以通过第一次的if(instance==null) ,由于lock机制的存在,只有一个线程进入了以下代码, 另一个在一旁等着,第一个进入并执行了以下代码,

if(instance==null) {

instance = new KaiXinHelper();

}

这样第一个线程就创建了类的实例,等第二个线程再进入的时候,instance已经不为null,这样就防止了第二个线程再次创建类的实例。

这就是设计模式中的Singleton 单件(创建型模式) ,以上主要是个人的理解,希望不会误导人家,有不足之处还请批评指正

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155598.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android快速开发之appBase——(1).appBase介绍「建议收藏」

    转载请注明本文出自JFlex的博客(http://blog.csdn.net/jflex/article/details/46430555),请尊重他人的辛勤劳动成果,谢谢!Android快速开发之appBase——(1).appBase介绍一直想写博客,苦于自己的文笔实在不行,在CSDN潜水了好几年,中间差不多3年没有写过博客。原因有二:1、文笔差;2、没时间。今年开始,时间充裕了,开始计划练练

    2022年4月3日
    52
  • 吞吐量与并发的公式,优化和参考值的关系_并发量怎么计算

    吞吐量与并发的公式,优化和参考值的关系_并发量怎么计算下面的都是整理别人的加上自己的一些思考,有什么不对请多多指教。1.公式:响应时间(RT)是指系统对请求作出响应的时间。吞吐量(Throughput)是指系统在单位时间内处理请求的数量。并发用户数(Maximumconcurrentuser)是指系统可以同时承载的正常使用系统功能的用户的数量。吞吐量一般指相当一段时间内测量出来的系统单位时间处理的任务数或事务数(我的理解,…

    2022年8月30日
    5
  • ubuntu20.04 LTS_Ubuntu 20

    ubuntu20.04 LTS_Ubuntu 20Ubuntu22.04LTS正式发布,采用Linux5.17内核,包括桌面改进、视觉变化及系统功能。

    2025年8月31日
    5
  • nginx做正向代理_反向代理和正向代理

    nginx做正向代理_反向代理和正向代理Nginx正向代理四种方式为什么需要正向代理案例配置方式第一种生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入为什么需要正向代理如果我们的服务部署在公司内网环境,不能直接访问互联网服务,就需要通过可以访问互联网的代理服务器来实现访问互联网的服务。此处我们使用Nginx作为代理服务器。案例互联网上的接口:https://

    2022年8月30日
    5
  • ftp下载工具,6款能够满足所有需求的ftp下载工具[通俗易懂]

    ftp下载工具,6款能够满足所有需求的ftp下载工具[通俗易懂]Ftp下载工具俗称来讲就是Ftp工具,是我们常用的一个服务。Ftp下载工具主要是网络上用来传送文件的工具。但有些Ftp软件传输文件不是特别稳定。今天就来为大家分享3款非常好用和用户满意度最高的Ftp下载工具。第一款:IIS7服务器管理工具这款软件的Ftp客户端做的是非常棒的,不仅具有批量操作功能,还具有定时同步(上传和下载)和自动更新功能。这些功能真的是我超爱的功能,做事效率提高了不止一星半点。而且特别容易上手,一般的软件都还需要熟悉一下,这个就是很快的能开始运用。好处很多,需要用户慢慢去体会。有的东西

    2022年4月28日
    55
  • matlab画圆的命令_matlab画圆命令资料

    matlab画圆的命令_matlab画圆命令资料%%圆环面R=6;r=2;symsuv;ezmesh((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u));axisequal;%%圆盘R=6;r=2;theta=linspace(0,2*pi,90);ph=linspace(r,R,30);[t,p]=meshgrid(theta,ph);r=t*0;[x,y,z]=pol…

    2022年6月19日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号