设计模式-原型模式

背景

克隆羊:有一只羊,有各种属性:姓名,年龄......,现在要克隆10只和这只羊一模一样的羊。

传统方法:

定义一个羊类,在客户端调取原型羊的信息,根据信息创建10个属性相同的羊。

问题:

①总是需要重新获取原始对象的属性,如果创建的对象比较复杂,效率就会比较低

②并不能动态地获取原型对象运行时的状态,当原型对象发生改变时,并不能灵活地对克隆对象进行改变

思路:

创建一个cloneable接口,让原型对象实现这个接口,对外调用接口方法实现克隆。

基本介绍

原型模式是指,通过拷贝原型对象,创建出新的对象,而无需知道创建的细节。

工作原理:通过原型对象自身实现的克隆方法,创建出新的克隆对象。

好处:在客户端克隆时,并不会因为原型的修改而改变,耦合度降低。

浅拷贝与深拷贝

浅拷贝(Java默认克隆方法)

在克隆过程中,原型的值类型(基本数据类型)成员变量,值传递给克隆对象。

引用类型的成员变量,只将引用进行传递,而不是重新创建相同的成员变量。

举个例子:如果背景中的原型羊有一个羊类型的朋友。那么克隆羊的羊朋友复制了原型羊的羊朋友的引用。也就是说他们的朋友指向同一只羊。并没有给克隆羊重新创建新的朋友对象。

深拷贝

为原型中的引用类的成员变量申请新的存储空间,并且复制原型中的这个成员变量的对象。

实现方法:

①在Java中,可以通过将引用类型的成员变量序列化(实现serializable接口),通过java内置的转成二进制数的方法,先将原型转成二进制输出。再将这个输出的二进制串捕获,转成物体,再输出,完成深拷贝。

②在原型中实现克隆方法时,新建引用类型的对象类,再对其进行赋值,(如果这个引用类的对象没有引用类型的成员变量,可以通过克隆这个对象实现)实现深拷贝。

缺点

需要给每一个原型配备克隆方法,代码复用性差。对于原有代码的改造需要修改其源码,违背了OCP原则(开闭原则)

相关推荐
zh路西法1 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
夏旭泽1 小时前
设计模式-备忘录模式
设计模式·备忘录模式
蓝染-惣右介2 小时前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式
捕鲸叉6 小时前
C++软件设计模式之类型模式和对象型模式
开发语言·c++·设计模式
诸葛悠闲6 小时前
设计模式——组合模式
设计模式·组合模式
诸葛悠闲6 小时前
设计模式——装饰模式
设计模式
西岭千秋雪_6 小时前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
捕鲸叉6 小时前
C++软件设计模式之代理(Proxy)模式
c++·设计模式
思忖小下6 小时前
梳理你的思路(从OOP到架构设计)_介绍GoF设计模式
设计模式·架构·eit