Prototype原型(创建型模式)

来源:互联网 发布:ssh 默认端口是多少 编辑:程序博客网 时间:2024/05/16 16:01
依赖关系的倒置
抽象不应该依赖于实现细节,实现细节应该依赖于抽象

 

动机(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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头撞墙起包了怎么办 儿童头撞墙起包怎么办 头撞墙了鼓包了怎么办 北京65岁老年证怎么办 怎么办65岁免费乘车卡 5个月小孩晚上哭怎么办 婴儿要含奶头睡怎么办 我把输入法删了怎么办 头发干枯毛躁怎么办用什么洗发水 落枕后脖子歪了怎么办 睡觉睡得脖子疼怎么办? 婴儿脖子睡歪了怎么办 怀孕8个月肚皮痒怎么办 怀孕大阴唇肿了怎么办 孕妇肚皮撑的疼怎么办 我大阴唇特别长怎么办 切完洋葱辣眼睛怎么办 下昆山车没刷卡怎么办 高德地图用不了怎么办 玩游戏老是闪退怎么办 苹果平板电脑闪退怎么办 钉钉忘记打卡了怎么办 钉钉手机号换了怎么办 玖富叮当贷逾期怎么办 玖富超能怎么办现金贷 包包的油边开裂怎么办 lv包包油边开裂怎么办 lv钱包油边开裂怎么办 德运奶粉没勺子怎么办 音响坏了没声音怎么办 6s蓝牙无法配对怎么办 魅族耳机进水了怎么办 苹果6耳机进水了怎么办 耳机内部线坏了怎么办 酷狗m1开不开机怎么办 小米2s蓝牙坏了怎么办 苹果手机蓝牙坏了怎么办 老婆不精明傻笨怎么办 老婆管得太严怎么办 骂自己父母的人怎么办 5岁宝宝说谎话怎么办