浅谈GoF23设计模式-“Prototype”模式
“Prototype”模式,原型模式是继“Singleton”,“AbstractFactory”,“Builder”,“FactoryMethod”后的最后一种创建型模式。
"Prototype"模式定义:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
在聊"Prototype"模式之前,还是想先介绍一下“拷贝”。
Clone:分为“浅拷贝”和深拷贝。
浅拷贝对于值类型和String类型成员拷贝时会在副本中重新创建成员,对于引用类型,对象和副本对象引用同一个内存地址,当在对象或者副本对象修改引用成员后,引用类型的成员就发生变化。(浅拷贝可以使用object下的MemberwiseClone())
深拷贝不管是值类型还是引用类型,对象和副本对象修改成员属性都只会改变各自对象的值,两个对象是完全独立的实体(深拷贝实现的四种方法)
“Prototype”模式应用场景:在软件系统中,经常面临着“某种结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但时他们却拥有比较稳定的接口。
“Prototype”模式要点:
1.)“Prototype”模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。
2.)“Prototype”模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个新类的对象,然后在任何需要的地方不断Clone。
3.)上边提到过的“浅拷贝”和“深拷贝”。
简单演示:
//按游戏中的兵种进行抽象,普通兵,飞行兵,水上兵
public abstract class NormalActor{
public abstract NormalActor Clone();
}
public abstract class FlyActor{
public abstract FlyActor Clone();
}
public abstract class WaterActor{
public abstract WaterActor Clone();
}
//继承NormalActor,FlyActor,WaterActor抽象类,根据对象中“成员类型”并且实现具体细节
//假设兵种对象的成员都是“值类型”和“string”类型,以浅拷贝为例
public class NormalActorA : NormalActor{
public override NormalActor Clone(){
return (NormalActorA)this.MemberwiseClone();
}}
public class FlyActorA : FlyActor{
public override FlyActor Clone(){
return (FlyActorA)this.MemberwiseClone();
}}
public class WaterActorA : WaterActor{
public override WaterActor Clone(){
return (WaterActorA)this.MemberwiseClone();
}}
//具体使用
public class GameSystem{
public void Run(NormalActorA normalActorA){
NormalActorA a1 = (NormalActorA)normalActorA.Clone();
NormalActorA a2 = (NormalActorA)normalActorA.Clone();
}}
以上就是“Prototype”模式的简单演示,到这里创建型的设计模式就差不多了,我们来讨论一下这几种创建型设计模式:
Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
FactoryMethod。AbstractFactory,Builder都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型来克隆“易变对象”。