使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
abstract class NormalActor{ public abstract NormalActor Clone();}
abstract class FlyActor{ public abstract FlyActor Clone();}
abstract class WaterActor{ public abstract WaterActor Clone();}
class NormalActor1 exteds NormalActor
{
public NormalActor Clone()
{
new 简单值对象新创建 对象地址 深复制浅复制
return (NormalActor)this;
}
}
class NormalActor2 exteds NormalActor
{
Clone()
}
class NormalActor3 exteds NormalActor
{
Clone()
}
class FlyActor1 extends FlyActor
{
Clone()
}
class FlyActor2 extends FlyActor
{
Clone()
}
class WaterActor1 extends WaterActor
{
Clone()
}
上边的类都实现了克隆方法,当来一个新类时水兵角色,就可以新建个类继承WaterActor,实现了扩展,然后修改run方法里的参数。
public class App
{
public static void main()
{
GameSystem gs = new GameSystem();
gs.run(new NormalActor1,new FlyActor2(),new WaterActor1());
}
}
public class GameSystem
{
public static void Run(NormalActor nana,FlyActor fafa,WaterActor wawa)
{
NormalActor na = nana.clone(); //new NormalActor1();
NormalActor na1 = nana.clone(); // new NormalActor2();
NormalActor na2 = nana.clone(); // new NormalActor3();
FlyActor fa = fafa.clone(); // new FlyActor1();
FlyActor fa1 = fafa.clone(); //new FlyActor2();
WaterActor wa = wawa.clone(); //new WaterActor1();
}
}
prototype模式的几个要点
prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,他同样要求这些易变类拥有稳定的接口。
prototype模式对于如何创建易变类的实体对象采用原型克隆的方法来做,它使得我们可以非常灵活地动态创建拥有某些稳定接口的新对象--所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone。
prototype模式中的Clone方法可以利用。net中的object类的MemberwiseClone()方法或者序列化来实现深拷贝。
有关创建性模式的讨论
Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是New所带来的耦合关系。
FactoryMethod,Abstract Factory,Builder都需要一个额外的工厂类来负责实例化易变对象,而prototype则是通过原型(一个特殊的工厂类)来克隆易变对象。
如果遇到易变类,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,在考虑重构为其他三种工厂模式abstract Factory,Builder,prototype