Prototype原型(创建型模式)

依赖关系的倒置
抽象不应该依赖于实现细节,实现细节应该依赖于抽象

 

动机(Motivation)

在软件系统中,经常面临着"某些结构复杂的对象"的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。


如何应对这种变化?如何向"客户程序"(使用这些对象的程序)"隔离出"这些易变对象",从而使得"依赖这些易变对象的客户程序"不随着需求改变而改变?


意图(Intent)

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象


结构 

 

 

 

 

 

图(一)的情况
        public class GameSystem
        {
            
public void Run()
            {
                NormalActor normalActor1 
= new NormalActor();   //徒步的小兵3个
                NormalActor normalActor2 = new NormalActor();
                NormalActor normalActor3 
= new NormalActor();

                FlyActor flyActor1 
= new FlyActor();   //飞行的小兵2个
                FlyActor flyActor2 = new FlyActor();

                WaterActor waterActor1 
= new WaterActor();   //潜水的小兵2个
                WaterActor waterActor2 = new WaterActor();
            }
        }

GameSystem依赖于内部的三种Actor

 

 

图(二)的情况

    
class Program
    {
        
static void Main(string[] args)
        {
            GameSystem gameSystem 
= new GameSystem();
            gameSystem.Run(
new NormalActorA(), new FlyActorA(), new WaterActorA());
        }

        
public class GameSystem
        {
            
public void Run(NormalActor normalActor,FlyActor flyActor,WaterActor waterActor)
            {
                NormalActor normalActor1 
= normalActor.Clone();   //徒步的小兵3个
                NormalActor normalActor2 = normalActor.Clone();
                NormalActor normalActor3 
= normalActor.Clone();

                FlyActor flyActor1 
= flyActor.Clone();   //飞行的小兵2个
                FlyActor flyActor2 = flyActor.Clone();

                WaterActor waterActor1 
= waterActor.Clone();   //潜水的小兵2个
                WaterActor waterActor2 = waterActor.Clone();
            }
        }

        
//NormalActorA
        
//NormalActorB

        
public abstract class NormalActor
        {
            
public abstract NormalActor Clone(); 
        }
        
class NormalActorA : NormalActor
        {
            
public override NormalActor Clone()
            {
                
return (NormalActor)this.MemberwiseClone(); //浅拷贝,这里引用类型要注意
            }
        }
        
class NormalActorB : NormalActor
        {
            
public override NormalActor Clone()
            {
                
return (NormalActor)this.MemberwiseClone();
            }
        }

        
//FlyActorA
        
//FlyActorB

        
public abstract class FlyActor 
        {
            
public abstract FlyActor Clone();
        }

        
class FlyActorA : FlyActor 
        {
            
public override FlyActor Clone()
            {
                
return (FlyActor)this.MemberwiseClone();
            }
        }

        
class FlyActorB : FlyActor
        {
            
public override FlyActor Clone()
            {
                
return (FlyActor)this.MemberwiseClone();
            }
        }

        
//WaterActorA
        
//WaterActorB,同上
        public abstract class WaterActor
        {
            
public abstract WaterActor Clone();
        }
        
class WaterActorA : WaterActor { }
        
class WaterActorB : WaterActor { }
    }

 

 

Prototype 模式的几个要点

·Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。

·Prototype模式对于"如何创建易变类的实体对象"采用"原型克隆"的方法来做,它使得我们可以非常地动态创建"拥有某些稳定接口"的新对象---所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone。

·Prototype模式中的Clone方法可以利用.net中的Object类的MemberwiseClone方法或者序列化来实现深拷贝 

posted @ 2009-12-30 00:36  疯狂的咸鱼  阅读(286)  评论(0编辑  收藏  举报