1、原型模式意图:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2、场景描述:
原型模式,利用实例自身的克隆功能来得到与原实例相同的新的实例。
设想西游记中的一个场景,唐僧师徒四人(白龙马除外),不过,该唐僧是个多事、喜欢使唤徒弟的唐僧。每当有事时,唐僧便会使唤他的三个徒弟去做。但是三个徒弟尽职尽责,为了保护师傅,必须留在唐僧身边。此时,多亏了三个徒弟能够千变万化,且都可通过毛发来变作自身(八戒、沙僧不知是否具有此功能?暂时看做有吧)。当唐僧需要洗衣、化斋、喝水、探路、借宿、吃水果等时,便会吩咐一个徒弟去做,此时该徒弟便通过具有的“克隆”功能产生一个新的自己去做这些事情,自己仍旧守护在唐僧身边。
3、原型模式类图:
角色:
- Prototype:声明了克隆自身的接口。
- ConcretePrototype:具体的物品,同样具有克隆自身的功能。如场景描述中的八戒、悟空、沙僧等。
- Client:用户类,使用Prototype作为属性或方法的传入参数,利用Prototype类型实例的Clone方法来获取新的Prototype实例。Client与Prototype类之间可能是关联或依赖关系。如场景描述中的多事、使唤指使人的唐僧。
协作:
- 客户请求一个原型,利用原型实例克隆自身的功能来获取新的实例。
4、实例类图:
说明:当唐僧同学有事要做,比如洗衣(XiYi)时,便会派一个徒弟去河边洗衣服。
实例类图中的类基本对应原型模式的类图。
5、实例代码:
TangSeng类的代码,对应用户类,相当于一个自产自销的工厂。
1 public class TangSeng{ 2 private SuperCreature wuKong; 3 private SuperCreature baJie; 4 private SuperCreature shaSeng; 5 6 public void xiYi(){ 7 SuperCreature baJieCloned = baJie.clone(); 8 9 //baJieCloned去洗衣服了。。。baJie仍在师傅身边 10 } 11 12 public void jieSu(){ 13 SuperCreature shaSengCloned = shaSeng.clone(); 14 15 //shaSengCloned去借宿了。。。沙僧仍在师傅身边 16 } 17 18 public void chiShuiGuo(){ 19 SuperCreature wuKongCloned = wuKong.clone(); 20 21 //wuKongCloned去找水果了。。。wuKong仍在师傅身边 22 } 23 24 public void huaZhai(){ 25 SuperCreature shaSengCloned = shaSeng.clone(); 26 27 //shaSengCloned去化斋了。。。沙僧仍在师傅身边 28 } 29 30 31 /*其他事情。。。。*/ 32 }
其他类的代码相对简单些,此处不列出,主要是提供自身克隆功能。
6、原型模式特点:
- 相比抽象工厂模式和工厂方法模式,极大的减少了子类的构造。
- 每个产品(或物品)类都需要提供克隆自身的功能,用于产生一个同样的对象。