首页 > 代码库 > 创建型—原型模式

创建型—原型模式

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、原型模式特点:

  • 相比抽象工厂模式和工厂方法模式,极大的减少了子类的构造。
  • 每个产品(或物品)类都需要提供克隆自身的功能,用于产生一个同样的对象。