设计模式(三):创建型之原型模式

news/2024/11/15 2:38:27/

设计模式系列文章

设计模式(一):创建型之单例模式

设计模式(二):创建型之工厂方法和抽象工厂模式

设计模式(三):创建型之原型模式


目录

  • 一、设计模式分类
  • 二、原型模式
    • 1、概述
    • 2、结构
    • 2、实现
    • 3、扩展(深克隆)


一、设计模式分类

  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式

二、原型模式

1、概述

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

2、结构

原型模式包含如下角色:

  • 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法
  • 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象
  • 访问类:使用具体原型类中的 clone() 方法来复制新的对象

接口类图如下:

在这里插入图片描述

2、实现

原型模式的克隆分为浅克隆和深克隆

  • 浅克隆
    • 创建一个新对象,原型对象和克隆对象中的引用对象,是同一个对象
    • 对于非基本类型属性,仍指向原有属性所指向的对象的内存地址
  • 深克隆
    • 创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址

  • Java中的Object类中提供了 clone() 方法来实现浅克隆
  • Cloneable 接口是上面的类图中的抽象原型类
  • native:本地方法,底层使用c语言实现,所以没有方法体
  • protected:同包或子类才有权限,所以需要重新clone方法,然后再super.clone()此方法即可

在这里插入图片描述

Realizetype(具体的原型类):

public class Realizetype implements Cloneable {public Realizetype() {System.out.println("具体的原型对象创建完成!");}@Overrideprotected Realizetype clone() throws CloneNotSupportedException {System.out.println("具体原型复制成功!");return (Realizetype) super.clone();}
}

PrototypeTest(测试访问类):

public class PrototypeTest {public static void main(String[] args) throws CloneNotSupportedException {Realizetype r1 = new Realizetype();Realizetype r2 = r1.clone();System.out.println("对象r1和r2是同一个对象?" + (r1 == r2));}
}

结果:false

3、扩展(深克隆)

//奖状类
@Data
public class Citation implements Cloneable,Serializable{private Student stu;@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}
}//学生类
@Data
public class Student implements Serializable {private String name;private String address;
}
  • 如果浅拷贝:则stu和stu1则是同一个对象
  • 通过序列化实现深拷贝,原型对象和克隆对象中的引用对象stu也是不同的
public class CitationTest1 {public static void main(String[] args) throws Exception {Citation c1 = new Citation();Student stu = new Student("张三", "西安");c1.setStu(stu);//创建对象输出流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\Think\\Desktop\\b.txt"));//将c1对象写出到文件中oos.writeObject(c1);oos.close();//创建对象出入流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\b.txt"));//读取对象Citation c2 = (Citation) ois.readObject();//获取c2奖状所属学生对象Student stu1 = c2.getStu();stu1.setName("李四");//判断stu对象和stu1对象是否是同一个对象System.out.println("stu和stu1是同一个对象?" + (stu == stu1));}
}

http://www.ppmy.cn/news/152687.html

相关文章

【代码审查】Phabricator工具系列:使用arc diff进行代码审查

最近开始提交CR了,特来总结一下使用arc diff进行代码审查的步骤。 在使用Phabricator进行代码审查时,arc diff是一个强大的命令行工具,可以轻松创建和更新Differential Diff,以便协作者对别人写的代码进行审查。 安装和配置 在…

docker从零开始(2)----应用部署/dockerfile

应用部署 通信 容器内的网络服务和外部机器不能直接通信外部机器和宿主机可以直接通信宿主机和机器可以直接通信当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容…

我们当下正在经历的这样一个以产业互联网为主导的新时代

我们当下正在经历的这样一个以产业互联网为主导的新时代,正是这样一种新发展的开始。   在这样一个阶段,互联网巨头们需要和其他的产业互联网玩家们一样,重新投身到产业的运行过程当中,需要和其他的产业互联网玩家们一样&#x…

安装油烟净化器不好?那是因为你对它有误解

很多餐厅忽略了厨房的卫生环境,对厨房环境不上心,同时也不在乎安不安装油烟净化器。其实安装油烟净化器是每个餐饮单位都要做的事情,但很多餐饮单位对安装油烟净化器还是有些误解,下面就是安装厨房油烟净化器的一些误解。 不用安装…

油烟净化器4大误区,千万别踩“坑”了

误区一:注重外观,忽略了内在功能。 追求时尚是没错,过分看重要不得。一套好的油烟净化设备,功能决定一切。充分了解产品功能,才能物尽其用,打造完美的无烟厨房。一定要注重油烟净化设备的内在,…

集成灶和油烟机哪个更实用?用集成灶轻松打造绝美开放式厨房

现如今,开放式餐厨空间俨然已经成为现代居家设计主流,意味厨房与餐厅不再只是烹饪或用餐的场所,而是成为每个家庭成员都能使用的公共场所。那么,在打造开放式厨房的时候,集成灶和油烟机哪个更实用?集成灶的…

unity 阳光插件_黄埔区阳光雅筑整厂空调维保价格,详情了解

首页 > 新闻列表 > 正文 作者:佚名 点击数: 5更新时间:2020-10-24 09:08:14 黄埔区阳光雅筑整厂空调维保价格, 一、硬件方面问题1、散热不良显示器、电源和cpu等在工作中发热量大,因此保持其良好的通风状况重要&#xff0…

BLDC电机应用持续火爆,“网红神器”筋膜枪前景几何?

BLDC 电机应用在近几年开始持续火爆,火爆应用也是百花齐放,比如前几年的无人机、电动工具、前年的网红风筒,出货量都达到了千万级数量。 尤其是筋膜枪,近两年来可以说是成为了大热门的“网红神器”——尽管 BLDC 电机应用是一个海…