这个模式在C++中什么时候才会使用,为什么不直接new,大家只要明白一个场景,就会知道它的用处。
比如,现在让你设计一个游戏,一共有8个关卡,每关的小兵有四种,但是第一关的小兵最弱,第八关的小兵最强,你怎么设计?
你可能认为这还不简单,需要小兵的时候,直接new一个相应的小兵,就可以了。但是这样做会遇见一个问题,比如第一关的小兵和最后一关的小兵,他们的属性肯定不一样,因此,如果直接new,导致的结果就是:每次new一个实例,都要初始化一次,因为每关的小兵属性不同,因此,我们不能直接使用new,因为那样太麻烦了,容易出错,特别是当每关的小兵数量特别多的时候,因此,最好的办法,就是每关开始的时候,初始化4个小兵,当需要更多的小兵的时候,只要从4个小兵复制一个就可以。
以上就是原型模式使用的一种场景。
为了方便客户端复制操作,我们定义一个统一的接口E,这个接口E中的主要方法就是Clone(),然后令A,B,C,D都继承E,这样,客户端无论要创建哪个小兵,只需要调用那个小兵实例的Clone方法就行,但是第一个小兵肯定需要new操作,否则无法创建。
Prototype角色
E就是Prototype,它定义了统一的自我复制接口,方便客户端使用。
ConcretePrototype角色
A,B,C,D就是ConcretePrototype,它们实现了自我复制接口。
Client角色
我们的程序就是Client,简单说就是main函数。