常说的设计模式是23种设计模式,分为3大类:
- 创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型
- 结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合
- 行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。
上次咱们说了“建造者模式”。今天来说“原型模式”。
“原型模式”是指已有一个类(原型类),将此类赋予可clone(克隆)的功能方法。
“class Anything”是将要克隆的一个类,必须实现Cloneable接口以支持clone功能,还要实现Serializable接口以支持序列化功能。(至于什么是序列化请参考IO技能中的“序列化与反序列化”的知识点取查阅。)
“class AnyOne”此类是“class Anything”的一个属性,也就是它的组成部分。
“class Anything”重写了clone方法,在实例化对象后,调用clone方法,方法返回结果是克隆后的对象将与原型对象不是同一对象。但是,它的组成部分“class AnyOne”的对象仍然和原型对象中的属性是同一对象,所以这样重写的clone方法叫“浅克隆”,仅仅是调用了父类的clone方法。
如果想要把“class Anything”实例化的对象及内部组成部分“class AnyOne”的对象完全克隆,就要用深克隆的方式解决。
“深克隆”指的是,将类中所有涉及的对象结构都克隆。
在代码中可以看出,重写clone方法时,利用了对象序列化的转换而达到的克隆效果,实际此代码并没将对象状态写入永久文件,而是将代码在内存中以Byte的类型进行了一次转换(写入及读取)。
实际测试调用效果便可知道,浅克隆及深克隆的特点。
下面来实现一个小的示例需求:
在四大名著《西游记》中,孙悟空是上入天下入地,可九天揽月,可下海捉鳖的狠人物。其中一大技能“身外化身”,再加手中的“金箍棒”谁人敢热。“单挑有神器,群殴叫兄弟”。
分身术相当的真实,即使再真实,也是分身,不是原型。因而这一技能,我们便可以用“原型模式”来表示出来。
先建立一个猴子类(Monkey),当然要由分身的技能(clone)。
当我们用浅克隆的时候,分身成功体现出来了,但是,猴子用的金箍棒是始终没有克隆。
这样的结果将会是,分身出多个个猴子都在使用一个金箍棒(GoldRingeStaff)。
所以要真正能够达到“猴手一个金箍棒”就需要使用深克隆的方式来解决。
“打群架”的孙悟空,“猴手一根金箍棒”
在实际应用中,每当克隆出猴子一个分身,连带金箍棒也一并克隆了。
“原型模式”是利用clone(克隆)的形式复制出对象,属于创建对象的一种方法。
此篇结束后,加上前面所说的“工厂方法、抽象工厂、单例、建造者”,在23中设计模式中,创建型模式均已介绍完,希望大家能快速理解及应用。