开心网外挂开发之 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 单件(创建型模式) ,以上主要是个人的理解,希望不会误导人家,有不足之处还请批评指正

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 解决Pycharm运行速度慢的方法「建议收藏」

    解决Pycharm运行速度慢的方法「建议收藏」用惯了Jupyter,Spyder的开发者切换到Pycharm时,发现不论是打开IDE的速度,还是调试的速度都慢的让人想砸电脑,笔者在这花了好长时间生闷气,最终总结了几个坑来解决运行速度慢的问题,希望能帮到大家。1.扩大Pycharm运行内存打开后找到-Xms-Xmx两行,增加运行内存(根据电脑配置,笔者是8G内存),可明显改善打开IDE的速度2.新建工程选择Python解释器笔者常用Anaconda,因此选用了它3.解决运行时查看变量速度慢的方法File->Setting-&gt

  • eplan激活码分享【最新永久激活】

    (eplan激活码分享)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html70YZDJVTFP-eyJsaWNlbnNlSW…

  • ReadProcessMemory与WriteProcessMemory用例分析「建议收藏」

    ReadProcessMemory与WriteProcessMemory用例分析「建议收藏」首先介绍一个函数VirtualProtectEx,它用来改变一个进程的虚拟地址中特定页里的某一区域的保护属性,这句话有些咬嘴,直接从MSDN中翻译过来的,简单来说就是改变某一进程中虚拟地址的保护属性,如果以前是只读的,那改变属性为PAGE_EXECUTE_READWRITE后,就

  • TraceView总结

    TraceView总结

    2021年12月14日
  • C#调用WebService实例和开发「建议收藏」

    C#调用WebService实例和开发「建议收藏」C#调用WebService实例和开发一、基本概念  WebService也叫XMLWebServiceWebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。简单的理解就是:webservice就是放在服务器上的函数,所…

发表回复

您的电子邮箱地址不会被公开。

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