开心网外挂开发之 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GridLayout在API21之前的兼容

    GridLayout在API21之前的兼容问题:GridLayout在API21时引入了android:layout_columnWeight和android:layout_rowWeight来解决平分问题,但是api21前怎么办呢?解决:1.引入兼容包:compile’com.android.support:gridlayout-v7:23.0.0’2.为GridLayout设置权重:app:layout_column…

    2022年6月3日
    32
  • 【JS字符串方法】JS字符串方法

    【JS字符串方法】JS字符串方法字符串的 ES5 和 ES6 方法 ES5String fromCharCode 该方法的参数是一系列 Unicode 码点 返回对应的字符串 charAt 该方法返回指定位置的字符 参数是从 0 开始编号的位置 charCodeAt 方法返回给定位置字符的 Unicode 码点 十进制表示 相当于 String fromCharCode 的逆操作 concat 方法用于连

    2025年10月28日
    6
  • ibm服务器如何装系统_ibm引导盘安装系统步骤

    ibm服务器如何装系统_ibm引导盘安装系统步骤小编了解到ibm服务器系统安装的方法是有别于安装其他品牌的服务器和台式机,而ibm笔记本一键启动u盘的快捷键是:F12;下面小编就把ibm服务器系统安装的方法讲解给大家听。首先需要准备的工具:两个大于4G的U盘,一个用来刻录IBM的官方引导镜像,一个用来刻录2008系统的镜像;软件方面,需要一个软碟通(UItralISO)软件。(上图是软件的图标,下图是软件打开的页面)1、打开软件后插入U盘,在软…

    2022年10月4日
    3
  • 仿射函数_仿射空间

    仿射函数_仿射空间今天看书用到仿射函数,不明白,上网查资料,貌似网上这方面资料也不是很多,有的也是讨论性质,不太准确。找到一些英文资料,现总结如下:线性(linear)定义:1:原空间内:如果在原空间内f(x+y

    2022年8月6日
    10
  • python数组操作备忘[通俗易懂]

    python数组操作备忘[通俗易懂]现有一段数组signalssignals[2:2,1]取值将为

    2022年8月13日
    6
  • 世纪之战:Python和Java,到底学哪个更好?

    世纪之战:Python和Java,到底学哪个更好?零基础自学java,点击了解:https://how2j.cn本文章转载自(如有侵权联系我删除):微信公众号Java技术栈有人曾经将编程比作做菜,那编程语言就是首先要准备的食材或厨具。尽管在刚开始开发AI时,有很多编程语言都可以满足你的需求,但没有一种编程语言是可以一站式解决AI编程的问题,因为在每一个项目中,不同的目标需要特定的方法。和做菜时的精挑细选一样,在成为一个「高手」…

    2022年7月7日
    21

发表回复

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

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