00:00
我们了解了scla当中伴生对象的概念和具体的一些应用,那其实我们就发现了,有了这个伴生对象,其实就可以非常方便的实现像Java里边提出的设计模式的相关的一些概念了,比如说我们可以直接把当前类的构造器啊,构造方法私有化,然后接下来呢?呃,那比方说我们想要实现这个单立设计模式,最简单的,那就直接在伴生对象里边去创建一个对象的实力全局只有这么一份。我们作为一个。属性放在这里,那就相当于类似于Java里边的static静态的一个属性嘛,然后接下来呢,定义一个公有的方法,这个方法直接返回这唯一的这一份对象实例就可以了,哎,所以这个其实是非常容易想到的一个思想,那接下来我们就在代码里边简单的也做一个测试。还是你有一个scla的object,目前我们这个叫做的12要测的是分利设计模式single,首先我们主要还是要译出类和半生对象,那类的话,我们干脆就直接copy这边的STUDENT11就可以了。
01:18
那关于我们把这个重命名叫做C12啊,这个是完全可以的,大家可以看到这里边我们其实也同样可以用STUDENT11里边的这个school属性,我们把它作为一个全局的,这是完全可以的,因为当前它就是一个对象吧,那在外边只要能访问得到这个对象,肯定都可以直接调用啊,这就是面对对象的这种状态,接下来我们要定义它的诞生对象,诞生对象名称必须是STUDENT12,那首先我们想到如果要是一个单立设计模式的话,最简单的想法自然就是直接在这儿定,定义一个艾的一个属性。
02:04
这个属性呢,直接就我们去拗出一个STUDENT12的对象,然后付给一个变量就可以了,那另外我们再定义一个public的方法,然后外边只要调那个方法返回这个对象不就完了吗?啊,所以这就是最简单的一种实现啊,Student。它的类型是STUDENT12,后面我们直接new一个STUDENT12,这里含入参数ALICE18后,接下来我们可以直接第一个,比方说这个叫get instance,可能比较熟悉这样的一种方法啊,我们在设计模式里边经常会定义get instance这样的方法,它返回的当然就是STUDENT12,那么直接把当前定义好的,类似于静态的这个对象直接返回就对了,全局只此一份啊,这是一个student,我们可以在这里做一个简单的测试,Value student,我们把它叫做student,一要去创建这个student,获取这个当前实例的时候,他会发现啊,不能用当前的这个类去new它的对象实力了,因为构造器是私有的,那我们这里就只能用它的,呃,目前的伴生对象,半生对象呢,调它,呃,At instance。
03:24
法啊,这样的话得到的就是我们定义好的这个student对象实例,我们可以测一下它的那infer到底是什么啊,那大家可能就想到了,那这个确实是全局只有这么一份吗?我们再去定义一个STUDENT2,同样还是调它的get instance方法,再来我们STUDENT2做一个打印,好,那有同学可能说了,你这个打印数据的话,不然他输出都应该是Alice,然后18岁,呃,School是艾特硅谷,这个肯定没问题,你定义的就是这么定义的嘛,你有的时候我们就哪怕他同时创建了两个。
04:02
就是先后创建了两个对象实例,那也同样内容都是爱丽丝18呀,啊,那我怎么样才能判断这它其实还是一份呢?哎,这个很简单,我们看一下一下它俩是否相等,或者我们得看一下他们的本身的引用是否是一致的,那干脆我们他们当前的这个引用直接打印输出吧,来STUDENT1和STUDENT2,我们来看一看到底是是否相同。大家可以看到,首先我们输出的内容肯定都是一样的,都是爱ice丝,18岁,At特硅谷,而且我们发现直接打印STUDENT1和STUDENT2得到的引用地址完全一样,说明我们获取的全局就这么一份,哎,这就是所谓的单利设计模式嘛啊,当然了,这种单立设计模式的实现大家会发现啊,呃,这其实是我们传说中的恶汉式的力设计模式啊,因为就是非常的一可上来之后我们直接就把这一个对象实力创建出来了啊不,不分游说啊,372不管三七二十一,直接把它作为一个静态属性放在这儿了,然后接下来调这个方法的时候,直接返回就完事了。那在有一些场景下呢,我们可能希望使用的是另外一种更加高效的手段,就是你当前不要来,不来就把这个对象创建出来,用到的时候再去创建啊,那就是来了之后呢,我先。
05:31
判断一下之前有没有,如果有的话,那我就拿过来直接用,如果没有的话,哎,这个时候我再去创建,那就是我们所说的还有一种啊,之前这个叫鄂汉式,那还有一种就叫懒汉式了,懒汉式的单力设计模式啊,这个有点像我们之前,嗯,函数式编程里边的lazy啊,就类似于这种懒加载的方式啊,这个怎么样来实现呢?因为当前的例生对象啊,它其实全局只有一份的,所以我们如果要是重新定义它的话,要把上面注掉名字同样还是叫做student的12,那接下来呢,我们就是。
06:12
还是定义这样的一个变量STUDENT12,既然是后面我们用到的时候才去判断它有没有再去给它赋值创建对象,那一开始的话,自然就应该是先给一个空值了啊,那如果要是给空值,那要更改,那就不能是V,不能是。常量了,我们必须要是VAR是一个变量,定义好,然后接下来呢,同样还是我们可以定义一个get instance。返返回的是一个STUDENT12对象实例,那我们这里边具体的操作就要进一步做一个判断了,如果目前这个student,哎,自然想到了啊,初始没有的时候,它其实是闹,如果它为空,那就表示。
07:10
没有对象实例的话,那么就创建一个,当然如果有的话,那就不要创建了,直接返回,所以这里边我们student让它等于new一个STUDENT12啊,当然里边的具体参数我们就还用这个爱丽丝18就可以了。最后如果说不管是之前判断有没有,那通过这个if代码执行完了之后,当然当前students就肯定有值了,这个时候直接返回,那这就是我们想要做的事情,实现了一个懒汉式的单利设计模式,我们同样也可以运行一下。上面的代码。大家看到还是一样,输出的内容完全相同,而且创建出来的STUDENT1和STUDENT2,其实他们的引用都一样,这是同一个对象,这就是关于单例设计模式的一个用法,使用半生对象可以很容易的实现各种设计模式。
我来说两句