00:00
梳理一下原型模式的内容。那原型模式的注意事项和细节呢?我们聊两句,总结一下。那原型模式呢,在创建新的新的对象,我们这个新的对象如果比较复杂的时候呢,可以利用原型模式。简化对象的创建过程,对不对,因为我一个克隆。就搞定了。同时呢,也能够提高我们的效率。所以说你看在spring这一个框架里面呢,它就充分利用了原型设计模式,那第二个呢,不用重新初始化对象,这是它的优点。而是动态的获取对象运行的状态。也就是说,如果我们这个对象。它在运行的过程中,它的状态发生变化了,那我什么时候克隆它的状态呢?也就会在那个时候拿到最新的数据,这也是他一个比较好的,也是它是动态的基因克隆。
01:00
第三点,如果原始对象发生了变化,你比如说它减少了属性,或者增加了属性,那么我们在克隆对象的时候呢,也会发生相应的这个变化。啊,发生相应的一个变化,这儿不是编号是变化,把它改一下。变化。OK,那不需要修改代码,最后呢,就是实现深扩容的时候,我们可能这个代码会稍微复杂一点。但如果我们用,我们用这个序列化和反序列化呢,也还是还是可以接受,对吧,一般的同学都还是能看懂,但原型模式呢,也有一个缺点,哪个缺点呢,我给大家。说一下就是原型模式呢,它需要给每一个类配备一个克隆方法。这个克隆方法可能是深度克隆,也有可能是你重写了它默认的克隆方法,总而言之呢,你是需要自己去配备的,那么这对全新的类来说不是难事,因为我在新写一个类,我就给他写一个克隆方法就行了,但是如果要对已有的类进行改造,就要修改源代码,你比如说原先我们有个A类,这个A类,呃,我们以前是没有支持这个克隆的。
02:11
就是以前不支持克隆,现在我们希望支持克隆,那你没办法,你只能对这个A类。进行修改源码,把这个克隆方法加进去。这样就违背了OCP的原则,这一点呢,请同学们注意一下啊,注意一下,OK,那我们现在把原型原型模式的内容呢梳理一遍,我们看看我们讲了哪些内容来跟上我的思路。OK,我们插入一个分页符。这边讲的是什么呢?原型模式。圆形。模式。哦,这个这个原型模式。好的。诶,这个地方弄错了啊。原型模式。怎么回事?原型模式来走一个,诶怎么回事,这这怎么怎么怎么变这样子了。
03:03
好练习模式。那原型模式我们先给大家讲的是一个提出了一个问题,就是克隆羊这个问题,引起大家对原型模式的思考,那这个克隆羊它的问题比较简单,就是我有一个羊这个对象,然后呢,我需要能够创建十个跟他一模一样,属性一模一样的羊,那这个时候呢,我们就首先用的是什么呀,传统的方法来解决,就是用这个传统的方案来解决,这样子吧。传统方案解决。啊,那么这个传统方案来解决呢,我们用的这个思路比较简单,就是我有一个这样的类过后呢,我就直接。去溜一个,然后不停的溜就行了,这是我们的第一种方案,那么我们把这个找到在哪里写的呢?是在这对吧,这个方案。是,这个方案很简单,就是我用一个client不停的去溜。
04:01
一个就行了,60次嘛。那这个方式呢,肯定是不合理的,所以说我们改进了一把。那这个原型模式它,呃,就是最初的写法,就是这样写的,很笨啊很笨,但是呢也也能用。也能用,只是呃,它用起来不是那么的顺手,对吧,所以说我们改变了,这是传统方式来解决的,紧接着呢,我们对这个传统方式进行了一个分析,就是它有哪些不足的地方,我们做了一个分析。把这个呢也列到这儿来。是吧,做了一个分析。那么分析出来我们这个结果,我们我们这个大致的意思就是说它存在这样一些问题。啊,存在一些问题,所以说我们提出了一个修改的思路,怎么样呢?就是用克隆,最后我们提出原型模式,在这提出来的是这样子吧,同学们。那提出这样一个思路过呢,我们就先给同学们介绍了一下原型模式它的基本概念。
05:03
叫原型模式是什么,做了一个了解,那这里呢,我这里总结了有。四句话。这四句话呢,对原型模式做了一个介绍啊,四句话看一下。对吧。说白了,原型模式呢,就是用原型实例指定创建对象的种类,然后呢,通过拷贝这些原型创建新的对象。其实最终我们用的是一个克隆方法啊,原型的呃这个呃,最最核心的就是对象顶克隆。这个方法来完成的。好的,那做了一个基本介绍以后呢,我们对原型模式它对应的这个u um这个类图,我们也给他做了一个基本的说明,就是用类图的方式来描述了一下原型模式长什么样子,你看从这个图我们可以看出来呢,他至少要有这么几个角色。一个是原型类,第二个就是实现了原型的这种类就是。
06:01
Concrete protocol type。那它里面拥有这几个角色呢?大家要有一个基本的认识,有三个对吧。我们把它列到一来。原型模式的结构图。的一个说明三点,Prototype呢指的就是它的原型内,这个原型内呢,它要去声明一个接口。而concrete pro呢,Prototype呢,它是一个具体的原型的,要实现克隆,就是说这个克隆方法你到底怎么去做,由你来决定。对,就是调用啊,就是调用它。好,这是对原型模式的原理做了一个介绍,紧接着呢,我们就用原型模式来对前面的克隆羊的问题进行了一个改进,是这样子吧,那具体来说这个代码呢,我们是这样完成的,把代码拿过来在这里。首先我们对这个she进行了一个改写。我们干什么呢?我们让它实现呢,就是代码实现,就这。
07:03
代码实现是这样子吧,同学们。好,诶这边写错了。给他来一个小箭头。那代码是怎么实现的。首先我们。写了一个sheep,就这个羊,这个羊它呢,在这里implements了con,呃,C。这个接口,这个接口里面呢,最核心的一个方法被我们写了一遍哪里。是不是在这里啊,就在这克隆。这里面我们根据自己的实际情况呢,进行了改写。改写完了怎么调用的,我们来看一下调用的方法,大家看我这新开了一个一一行啊,新开了一行,调用的时候是在C里面调的。这个时候呢,都要是C点克隆就可以了,但是同学们要注意,你克隆完了过后呢,诶克隆完了过后同学们要注意的一点就是在默认情况下,我们这一个是一个前前拷贝,也就是说这个friend在前前拷贝的时候克隆呢,并不会去对这个引用类型所指向的那一个对象再给你拷贝一下,所以说默认情况下是前拷贝写到这里。
08:14
默认是前拷贝没问题吧。所以说是这样一个道理。然后呢,我们在这整完了以后呢,我们又说,诶,那原型模式有没有在框架里面用到呢?显然是有的,就在哪里呢,在spring框架里面我们就能看到原型设计模式的一个应用,具体来说就是在spring里面我们创建一个B的时候,哎,这里面呢就用到了。对,就用到了我们这个原型模式对不对,好原型模式,那具体来说这段代码呢,我们就直接把这个图截过来就行了,好吧,因为并不难,所以我把这个核心的一个示意图拿过来就可以了,源码我就不截了,同学们,因为最后这个源码呢,会以会以这个代码的形式发给大家,所以你一看这就知道哦,这有个BS插面文件,这面通过scope指定它是圆形的。
09:09
那么圆形的时候呢?这里面有钙的病,往里面追。往这个get b里面追呢,会最终追到一个do get方法,这个do get方法里边呢,他去判断你这个scope里面是什么值,如果是个单立的,是个痛的,那么它走的是单立这种方式来创建,如果走的是圆形,它是按圆形模式来创建这个病,那圆形模式大家要注意的它。每获取一次呢,都是不一样的,比如说你这个get的病,Get到一次得到一个病,再盖一个呢,得到一个病属性都一样,但是不是同一个病,对不对?好这点我在讲代码的时候其实是说过的。其实说过的好,这里就不再多说,把这个说完了,过后呢,我们又探讨了一个问题,就是。在我们原型模式里面涉及到的浅拷贝和深拷贝的问题。
10:00
那么在默认情况下呢,我们是前拷贝。就是你没有做,你你用的是默认的克隆方法,那它就是一个前拷贝。是这样子吧,强哥杯我们这儿整理了几句话,大家可以看一下。OK,前靠背我们整理了几句话,看一下就可以了,是这样子的。那浅拷贝完了过后呢,我们说了,既然有浅拷贝就会有深拷贝,所以说我们把深拷贝的概念先给同学们聊了一下。深拷贝的概念聊了一下,所以深拷贝的概念呢,诶在在这上面。OK,现在这样子吧,把它列一下就行了,拷贝那么深拷贝就是对象进行深拷贝,要对整个对象进行拷贝。这个所谓的整个对象就是包括啊,包括对象的引用类型。OK,就这样子的,那实验方法呢,一个是克隆。这个克隆有点麻烦,就是你要对那些引用类型单个的处理,还有就是对象的序列化。
11:01
OK,那我们把这个介绍完了过呢,我们走了两个案例是不是啊,那分别呢,给大家演示了一下,把代码给大家整理一下,在这这个代码呢,是我们敲出来的,对吧?给他演示了一下。OK,那这里面我们用的是。段代码来说明,我把代码呢给大家板书到笔记中,哪里呢?实际上就在这里是不是?这里面有三个类,首先这个是我们的一个类,这个类是相当说。在我们要引用的一种类型。那么把这个给他拿过来就行了。放这儿啊,同学们跟上思路。插入一个表格。好,这是第一个文件。第二个文件呢,第二个文件就是我们这个原型。在圆形里面有两种方式看,一个是克隆,一个是通过对象序列化,我们推荐使用第二一种好把它放到这里。好,紧接着呢,我们也说了一下端怎么去用的,Java怎么用呢。
12:01
用也很简单哈,把这个拿过来。呃,其实就是如果是浅拷贝,你就掉了一个克隆,如果深拷贝叫地普克隆就完事了。啊,也很很好理解,很好理解,好这是我们的代码。那这个讲完了以后呢,我们就对原型模式的细节做了一点描述,就是原型模式有哪个地方,呃,不好的地方或者好的地方我们都都给大家做了一个整理,那具体来说,好的地方呢,还是比较明显的哪里呢?它的优优势之处就是说它在简化对象的创建过程中可以提高效率。直接一个克隆就完事了,而且它有个好处,就是它可以动态的获取对象运行的状态。动态的获取啊,动态的获取对象运行的这个状态,比如说你这个属性。发生变化了,在变化的一瞬间我进行克隆,那我得到是最新的这个属性。还有一点呢,他也有缺点,强调一下缺点就是说。
13:00
他需要对每个类配一个克隆方法。啊,要对每个类配个克隆方法,这点大家注意一下就行了,好的,那这个呢,就是我们讲的原型设计模式的相关内容,大家好好的体会一下,OK,关于原型模式我们就给大家讲解到这里。
我来说两句