设计模式 - 学习笔记 - 原型模式Prototype Pattern
发布日期:2021-06-30 14:54:16 浏览次数:2 分类:技术文章

本文共 4326 字,大约阅读时间需要 14 分钟。

设计模式 - 学习笔记 - 原型模式Prototype Pattern

学习总结

  1. 对象创建模式。解耦:你别new你直接用interface接就行了,要啥你直接叫我。
  2. 原型的特点就是自我复制。Java中的Cloneable接口和它的clone()方法想必都接触过吧。

动机 Motivation

  1. 在软件系统中,经常面临着“某些结构复杂的对象’的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。
  2. 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?

应用场景

  1. 某个实例的创建过程非常耗费资源。但它又经常大量的用,那我们就是创建出一个作为原型,然后克隆…克隆…克隆…
  2. 比如关卡中的怪物、地图中的小兵。

UML

在这里插入图片描述

代码示例

1. 实现 Cloneable 接口: 浅拷贝

@Datapublic class Hero implements Cloneable {
private String name; private int level ; private List
friend; @Override protected Object clone() throws CloneNotSupportedException {
return (Hero)super.clone(); }}
public class PrototypePatternDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Hero hero = new Hero(); hero.setName("华安"); hero.setLevel(99); ArrayList
heroes = new ArrayList<>(); heroes.add(new Hero()); heroes.add(new Hero()); hero.setFriend(heroes); Hero hero2 = (Hero)hero.clone(); hero2.setName("张三"); hero2.getFriend().get(0).setName("李四"); hero2.getFriend().get(1).setName("王五"); System.out.println(hero); System.out.println(hero2); }}

2. 实现自己定义接口 Prototype: 浅拷贝

public interface Prototype {
Prototype clone();}
@Datapublic class Hero implements Prototype {
private String name; private int level ; private Hero[] friend; @Override public Hero clone() {
Hero hero = new Hero(); hero.setName(this.name); hero.setLevel(this.level); hero.setFriend(this.friend); return hero; }}
public class PrototypePatternDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Hero hero = new Hero(); hero.setName("华安"); hero.setLevel(99); hero.setFriend(new Hero[]{
new Hero(), new Hero()}); Hero hero2 = (Hero)hero.clone(); hero2.setName("张三"); hero2.getFriend()[0].setName("李四"); hero2.getFriend()[1].setName("王五"); System.out.println(hero); System.out.println(hero2); }}

实现 Cloneable 接口,序列化/反序列化: 浅深贝

public interface Prototype {
Prototype clone();}
@Datapublic class Hero implements Serializable, Prototype {
private static final long serialVersionUID = 1L; private String name; private int level ; private Hero[] friend; @Override public Hero clone() {
Hero hero = new Hero(); hero.setName(this.name); hero.setLevel(this.level); hero.setFriend(this.friend); return hero; } public Hero deepClone() {
ByteArrayOutputStream bos = null; ObjectOutputStream oos = null; ByteArrayInputStream bis = null; ObjectInputStream ois = null; try {
// 序列化流 bos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bos); // 输出当前对象 oos.writeObject(this); // 反序列化流 bis = new ByteArrayInputStream(bos.toByteArray()); ois = new ObjectInputStream(bis); return (Hero)ois.readObject(); } catch (Exception e) {
e.printStackTrace(); } finally {
try {
bos.close(); bis.close(); oos.close(); ois.close(); } catch (IOException e) {
e.printStackTrace(); } } return null; }}
public class PrototypePatternDemo {
public static void main(String[] args) throws CloneNotSupportedException {
Hero hero = new Hero(); hero.setName("华安"); hero.setLevel(99); hero.setFriend(new Hero[]{
new Hero(), new Hero()}); Hero hero2 = (Hero)hero.clone(); hero2.setName("张三"); hero2.getFriend()[0].setName("李四"); hero2.getFriend()[1].setName("王五"); System.out.println(hero); System.out.println(hero2); System.out.println("---------------------------------------------"); Hero hero3 = (Hero)hero.deepClone(); hero3.setName("赵六"); hero3.getFriend()[0].setName("沈七"); hero3.getFriend()[1].setName("重八"); System.out.println(hero); System.out.println(hero3); }}

参考资料

转载地址:https://jerryjin.blog.csdn.net/article/details/115914222 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Maven 学习笔记 依赖范围
下一篇:设计模式 - 学习笔记 - 建造者模式Builder Pattern

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年05月06日 10时59分38秒