开心网外挂开发之 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)


相关推荐

  • idea2021.4.13 mac版本激活码【在线破解激活】「建议收藏」

    idea2021.4.13 mac版本激活码【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • ESLint结合gulp使用

    ESLint结合gulp使用ESLint结合gulp使用一、安装二、使用步骤1.引入库2.读入数据总结一、安装示例:pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsimportwarningswarnings.filterwarnings(‘ignore’)im

  • linux文本编辑器

    linux文本编辑器linux常见服务一.文本编辑器vivim是vi增强版vim需要安装sudoapt-get-yinstallvimvim的三种工作模式1编辑模式命令模式=>编辑模式iaos按键作用i在光标当前位置插入文本a光标的下一个位置插入文本A当前行的行尾插入文本S…

  • mysql mediumtext 最大_mysql – TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT最大存储大小

    mysql mediumtext 最大_mysql – TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT最大存储大小上升到@Ankan-Zerob的挑战,这是我对每个文本类型中可以存储的最大长度的估计:Type|Bytes|Englishwords|Multi-bytewords———–+—————+—————+—————–TINYTEXT|255|±44…

  • python从入门到精通——完整教程

    python从入门到精通——完整教程<linkrel=”stylesheet”href=”https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-1a85854398.css”><divid=”content_views”class=”htmledit_views”><p>&nbsp;</p>文章目录…

  • 宽字节注入(一)_低字节在前高字节在后

    宽字节注入(一)_低字节在前高字节在后在PHP中有这样一个函数:magic_quotes_gpc它的作用就是将你输入的特殊字符前面统统加一个\符号如下图前2句话在看下面这条语句之前,我们首先需要知道。\’只能和\’进行闭合下面这个语句,显然不能将1进行闭合。而是将\当成了一个字符串。后面的单引号把后面的给后面的给闭合了。不能闭合,就显然不能进行SQL注入。这就是magic_quotes_gpc函数的作用了。select*fromadminwhereid=’1\’unionselect–+

    2022年10月14日

发表回复

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

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