设计模式之 原型模式

  • 概念
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,简单理解就是拷贝

在Java中实现原型模式十分简单,只需要实现Cloneable接口并重写clone()方法就可以了

  • Code package com.tanoak.create.prototype; public class Apple implements Cloneable{ private String name ; private String color ; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Apple() { System.out.println("正在构造苹果,无参"); } public Apple(String name, String color) { System.out.println("正在构造苹果,有参"); this.name = name; this.color = color; } @Override protected Apple clone() throws CloneNotSupportedException { return (Apple)super.clone(); } }
    • 测试 public class Main { public static void main(String[] args) throws Exception { test1(); } public static void test1() throws CloneNotSupportedException { Apple redApple = new Apple("红富士","红色"); System.out.println(redApple); Apple blueApple = redApple.clone(); /* blueApple.setColor("青色");*/ System.out.println(blueApple); } } 从以下运行结果可以看出构方法只执行了一次,就生成了两个对象

    看到这里一切都很正常,但是,当我对Apple类增加引用类型

    • Code

public class Apple implements Cloneable{
    private String name ;
    private String color ;
    private ArrayList<Integer> list ;
    
    public ArrayList getList() {
        return list;
    }
    
    public void setList(ArrayList<Integer> list) {
        this.list = list;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getColor() {
        return color;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public Apple() {
        System.out.println("正在构造苹果,无参");
    }
    
    public Apple(String name, String color) {
        System.out.println("正在构造苹果,有参");
        this.name = name;
        this.color = color;
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    
    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", list=" + list +
                '}';
    }
}
  • 测试 public class Main { public static void main(String[] args) throws Exception { test1(); } public static void test1() throws CloneNotSupportedException { Apple redApple = new Apple("红富士","红色"); ArrayList<Integer> arrayList = new ArrayList() ; arrayList.add(1) ; arrayList.add(2) ; redApple.setList(arrayList); Apple blueApple = (Apple)redApple.clone(); blueApple.setColor("青色"); blueApple.getList().remove(1) ; System.out.println(blueApple); System.out.println(redApple); } }

List的值被改变了,由此引出一个结论‘浅拷贝’ 1. 对于引用类型,只拷贝其引用 2. 不能完全做到保护性拷贝 现在再次对clone() 方法进行改造,引出‘深拷贝’

  • Code @Override protected Apple clone() throws CloneNotSupportedException { Apple clone = (Apple) super.clone(); clone.list = (ArrayList<Integer>) list.clone(); return clone; } 再次运行的结果如下

由此就达到了深拷贝的效果

  • 优点
    1. 对象的创建非常复杂,可以使用原型模式快捷的创建对象,不需要知道创建细节。
    2. clone方法是由虚拟机直接复制内存块执行,速度比使用new的方式创建对象要快。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

09(02)总结final,多态,抽象类,接口

(4)抽象类的练习 A:猫狗案例练习 B:老师案例练习 C:学生案例练习 D:员工案例练习 /* A: 猫狗案例 具体事物:猫,狗 共性:姓名,...

42660
来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:集合

15770
来自专栏Android知识点总结

再见kotlin--02函数

8820
来自专栏程序员叨叨叨

8.1 函数第 8 章 函数与程序设计

通过第 5 章到第 7 章的阅读,我们已经知道了怎么声明变量(第 5 章),怎么写表达式和语句(第 6 章),怎么将输入 \ 输出参数绑定到语义词(第 7 章)...

10820
来自专栏个人随笔

Java 接口理论篇

接口的两层含义:接口作为数据类型   狭义的接口  接口的第二层含义:工具 广义的接口 在接口中所有的变量都是静态常量 在接口中所有方法都是抽象方法 定义一个接...

35160
来自专栏我的博客

基数排序

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,...

30760
来自专栏禁心尽力

Java Collection知识总结

首先说说java中常用的集合容器:ArrayList,LinkedList,Vector,HashMap,Hashtable,HashSet,TreeSet。【...

207100
来自专栏Golang语言社区

第四节 Go语言数据类型

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

8220
来自专栏Java帮帮-微信公众号-技术文章全总结

第二天 变量数据类型运算符【悟空教程】

17160
来自专栏诸葛青云的专栏

简述在C语言中, “字符”与“字符串”之间的区别

在C语言中,“字符”与“字符串”之间,是有区别的。这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别。

27230

扫码关注云+社区

领取腾讯云代金券