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方法或者序列化来实现深拷贝 



http://www.cnblogs.com/jonniexie/articles/1635625.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值