原型模式

原型模式


           原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

           原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。

           使用克隆方式来创建对象,同样用来创建对象的工厂模式的区别:工厂模式对新产品的适应能力比较弱,创建新的产品时,就必须修改或者增加工厂角色,而且,为了创建产品对象要先额外的创建一个工厂对象。




           具体组成:

           客户角色:让一个原型克隆自己来得到一个新对象。

           抽象原型角色:实现了自己的 clone 方法,扮演这种角色的类通常是抽象类,且它具有许多具体的子类。

           具体原型角色:被复制的对象,为抽象原型角色的具体子类。

           对于.NET而言,那个原型抽象类Prototype是用不着的,因为克隆实在是太常用了,所以,.NET在System命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),这样你就只需要实现这个接口,就可以完成原型模式了。


           与工厂模式的区别:

           在工厂模式中,按照定义客户角色不仅要负责使用对象,而且还要负责对象原型的生成和克隆,这样造成客户角色分工就不是很明确。

           所以,我们把对象原型生成和克隆功能单拿出来放到一个原型管理器中,原型管理器维护了已有原型的清单,客户在使用时会向原型管理器发出请求,而且可以修改原型管理器维护的清单。

           这样客户不需要编码就可以实现系统的扩展。

           原型模式的代码结构:

//原型模式结构
//原型类
abstract class Prototype
{
    private string id;
    public Prototype(string id)
    {
        this.id = id;
    }
    public string Id
    {
        get { return id; }
    }
    public abstract Prototype Clone();
}
//具体原型类
class ConcretePrototype1 : Prototype
{
    public ConcretePrototype1(string id)
        : base(id)
    { }
    public override Prototype Clone()
    {
        return (Prototype)this.MemberwiseClone();
    }
}
            //客户端代码
            ConcretePrototype1 p1 = new ConcretePrototype1("I");
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
            Console.WriteLine("Cloned:{0}", c1.Id);
            Console.Read();


           原型模式的优点:

           当客户自定义新的产品对象时,同时向原型管理器注册一个原型对象,而使用的类只需要根据客户的需要来从原型管理器中得到一个对象就可以了,这样就使得功能扩展变得容易些。

           原型模式与其它创建型模式有着相同的特点:它们都将具体产品的创建过程进行包装,使得客户对创建不可知。

           通过增加或者删除原型管理器中注册的对象,可以比其它创建型模式更方便的在运行时增加或者删除产品。

           如果一个对象的创建总是由几种固定组件不同方式组合而成,如果对象之间仅仅实例属性不同,将不同情况的对象缓存起来,直接克隆使用,这比采用传递参数重新new 一个对象要来的快一些。


           原型模式的缺点:

           原型模式主要的缺陷就是每个原型必须含有clone 方法,在已有类的基础上来添加clone 操作是比较困难的,而且,当内部包括一些不支持copy 或者循环引用的对象时,实现就更加困难了。

           原型模式与工厂模式的联系:

           原型管理器就是一个工厂,当然,这个工厂经过了改进,去掉了像抽象工厂模式或者工厂方法模式那样繁多的子类,因此,可以说原型模式就是在工厂模式的基础上加入了克隆方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值