原型模式

开始原型模式前,我们要知道深拷贝的定义,因为原型模式中的克隆操作核心就是深拷贝。

深拷贝和浅拷贝

下图为浅拷贝(即是编译器的默认版本), 只拷贝了指针, 两个指针同时指向一个内存, 会有危险(a改变时b也改变, 称为别名) , 导致内存泄漏

调用strcpy复制,自动复制结尾的'\0'

下图为深拷贝, 添加了动态分配内存和拷贝内容进新创建的内存

C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数

两个的区别?

        ①在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的;但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象,所以,此时,必须采用深拷贝。

        ②深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝。

-动机

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

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

-模式定义

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

-结构/类图

-要点总结

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

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

原型模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝。

工厂模式和原型模式的区别:

        ①性能区别:如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象 ,以达到节省创建时间的目的。

        实际上,创建对象包含的申请内存、给成员变量赋值这一过程,本身并不会花费太多时间,或者说对于大部分业务系统来说,这点时间完全是可以忽略的。应用一个复杂的模式,只得到一点点的性能提升,这就是所谓的过度设计,得不偿失。

        但是,如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取 ,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。
        ②使用场景区别:原型模式更侧重用在同种对象(正常/感冒/发烧的人),保留对象的中间态,在需要某种状态的对象(感冒的人)的时候对它进行克隆;工厂模式侧重分类各种对象(正常的人/猫/狗),在需要猫时,调用猫工厂创建猫。

代码如下:

 结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值