00:00
我们来看圆形模式。还是由一个问题引出我们对原型模式的一个思考,大家看这里面呢,有这么一个情况,有这么一个情况,什么情况啊,大家可以看到。说有一只羊叫汤姆。他们这个这个这个羊名字呢,已经定下来了,就是汤姆,他的年龄为一岁,颜色为白色,是一只白色的羊,他说请编写程序,创建跟汤姆。这个跟汤姆羊属性完全相同的十只羊,请问你怎么思考?呃,怎么去完成?好了,这道题我们还是老规矩,先用传统的方法解决克隆羊的问题,我们先做思路分析,再完成代码,最后分析问题所在,从而引出我们原型模式。打开这里。好的,同学们可以看到呢,现在我们新建一个package。
01:00
原型模式写下pro type。没问题,Pro。那在这里呢,我们根据我们原先思路,还是老规矩,我们先先画一个类图。对不对,先把那图画出来,说说我们一个想法是什么样子的。看这里。那既然你是克隆羊,你首先得先有羊这个类。Z。阳里面有什么属性呢?根据刚才的这个分析,肯定这个阳呢,它会有名字。是吧,Name。是最。史俊。羊还有什么呢?羊还有年龄。对吧,他有年龄好比如说age。他有年龄H,然后呢是个特类型的等等,我就不写这么多了。那现在我有一个客户端,我要去用它,当然很简单,比如说我这里有一个客户端要去使用它。
02:01
那怎么去使用它呢?非常简单,我只要去把它拿过来用就行了,也就是说我依赖你就行。那我直接溜嘛,我60次就行了。是不是好,这个很简单的一个思路,那同学们,我们把这个最简单的思路先用代码给各位朋友实现一下。来走一个,首先呢,我们把she。创建起来。那根据刚才的分析,它需要有三个属性,第一个是名字。第二个是年龄。对吧,Int还有一个是它的颜色color。洗完了,那现在呢,我们给他一个构造器。给他一个构造器来,我们看看这个构造器呢,诶做这个啊。给他一个。
03:00
诶,我们看看这个地方。为什么他?啊,这个还不行哈,O啊填O。Name color填进去。第二个呢,我们把晒的方法,钙的方法也给它生成都给了。没问题吧,然后我们要输出信息,我们还需要一个string方法。这样子呢,我们就把。羊这个,呃,就是shep这个类创建起来了,那我们在客户端要去用它显示,非常简单的一件事情,就跟我刚才写的看。对不对。Client,因为你现在要有十只羊,那代码就其实挺好写的,你就复制就完了,所以说我们先用传统的方法。解决就最简单的方法,肯定就这样写嘛,那就六一个C。这样的对象。那这个阳呢,他刚才说了。名字为汤姆,年龄为一岁。
04:01
颜色为白色。没问题,对不对,然后呢,我把这个生成第一只羊就创建起来了。那中间你起来后面这个阳当然就很简单了,你看后面这个羊C。是我把。我根据你这只羊的名字。去创建下一只羊,比如get name。然后呢,用she这只羊的年龄去初始化下一只羊的年龄,同样我还用sheep。这只羊的颜色去促使下次羊的羊好,那么这边呢,我们分分配一个名字C2。你不是一共有十支吗?那最笨最笨的办法就这样复制,是这样子吧,那就是第三支,第四支,第五支,好,其他的我就不写那么多了等等等。等等等。然后呢,我们就输出这个信息。
05:00
我们输出这个信息来看一下第一只羊。的信息是这个第二只羊C。第三只羊,CP3。对不对,第四只羊是。第五只羊,我。那下面的678这个我就不去写了,非常的简单,我们运行一把。运行跑起来这个没问题,就是他会把五字样的信息打出,而且都是一样的。那现在我们来分析一下这种方案,它有什么不好呢?来,我们分析一把。首先。他的优点就是比较好理解。也比较简单,容易操作。那么它缺点是哪里呢?在创建新的对象时,总是需要重新获取到原始对象的属性,你看,你每次都get了。如果创建的对象比较复杂,效率就比较低,因为你每次要盖的它的,比如说你这个,你这个对象的属性有十个。或者你这个属性我们说的极端01:20个。
06:00
那你是不是创建一个叫GET10次二二十次,十次很麻烦,第二点总是需要重新,总是需要重新初始化对象,而不是动态的获取对象运行的状态不够灵活,因为你这个你这个信息有可能变化,对吧,名字或者年龄它可能变化,假如我们希望在创建新的对象时,他的年龄变化了,你新建的对象也变化了。那这样就他不够灵活,因为他不是动态获取的。那么我们改进的思路怎么改进呢?大家看我的思路,这样子的Java中呢,有一个optic类。这个类是所有类的鸡肋。所有类的根类会这样,Object类呢?它提供了一个叫克隆的方法。诶,这边有个克隆方法,该方法可以将Java的对象复制一份。但是需要实现克隆的Java类,就是需要实现克隆的Java类呢,必须要实现一个接口叫。
07:00
如果我们实现了这样一个C,就表实现这个接口就表示该类能够复制。并且具有复制的能力。那这个时候呢,只要用到这样一个接口,或者用到克隆相关的东西呢,我们就会用到原型模式。这样就引出我们。这个原型模式的概念了,那下面呢,我们就准备来讲一讲何为原型模式,并且用原型模式来改进我们第一种方案。第一种方案这个问题我已经提出来了啊,就大家要知道,我们第一种传统写法虽然可以用,但是呢弊端比较多,所以说我们要改进。好,关于解决克隆羊的这个第一个探讨的。方式,我们就说到这里。
我来说两句