博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(@WhiteTaken)设计模式学习——原型模式
阅读量:5337 次
发布时间:2019-06-15

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

有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的。

这时候我们可以用到原型模式,也就是克隆模式

原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使新对象的数据与原对象数据保持一致。

原型模式是由原对象发起的,创建新对象的方法。

原对象与新对象具备一样的数据结构以及一样的值。

克隆模式有浅层克隆和深层克隆之分(主要体现在对引用对象的处理不同)

 

直接上代码。

1.创建一个书类,书有几个属性,名称,书页数,出版单位,作者等。

2.实现克隆模式,java的话需要实现cloneable接口

3.在类中实现克隆的方法,本例中有浅层克隆和深层克隆两种方法。区别在于对引用对象的处理。

1 import java.util.ArrayList; 2 import java.util.List; 3  4 public class Book implements Cloneable{  //原型模式需要实现cloneable接口 5     private String name; 6     private int number; 7     private String company; 8     private List
author;      //指向的是一个引用的空间 9 public String getName() {10 return name;11 }12 public void setName(String name) {13 this.name = name;14 }15 public int getNumber() {16 return number;17 }18 public void setNumber(int number) {19 this.number = number;20 }21 public String getCompany() {22 return company;23 }24 public void setCompany(String company) {25 this.company = company;26 }27 28 public List
getAuthor() {29 return author;30 }31 public void setAuthor(List
author) {32 this.author = author;33 }34 35 //浅层克隆,clone以后引用会保持一致,当引用对象发生改变,两个克隆对象就会发生改变36 public Book ShallowClone(){37 try {38 return (Book) super.clone();39 } catch (CloneNotSupportedException e) {40 // TODO Auto-generated catch block41 e.printStackTrace();42 return null;43 }44 }45 //深度克隆,需要对有引用的地方进行操作46 public Book DepthClone(){47 try {48 Book book=(Book)super.clone();49 List
authors=new ArrayList
();50 for(String author:this.getAuthor()){51 authors.add(author);52 }53 book.setAuthor(authors);54 return book;55 } catch (CloneNotSupportedException e) {56 // TODO Auto-generated catch block57 e.printStackTrace();58 return null;59 } 60 }61 }

4.主客户端测试代码

1 import java.util.ArrayList; 2 import java.util.List; 3  4 //原型模式也叫克隆模式 5 public class MainClass { 6     public static void main(String[] args) { 7         Book book1=new Book();                  //实例化一个book1 8         book1.setName("shujujiegou"); 9         book1.setNumber(100);10         book1.setCompany("TomCompany");11         List
author=new ArrayList<>();12 author.add("Tom");13 author.add("WhiteTaken");14 book1.setAuthor(author);15 16 Book book2=book1.ShallowClone();        //实例化一个book2,调用book1的浅层克隆方法17 book1.setName("数据结构");            //浅层克隆,引用指向同一个,但是String等类型的值直接克隆18 author.add("Langer");              //修改book1的值,浅层克隆book1和book2指向的是同一个引用,打印的值相同19 20 System.out.println(book1.getName());21 System.out.println(book1.getNumber());22 System.out.println(book1.getCompany()); 23 System.out.println(book1.getAuthor());24 25 System.out.println(book2.getName());26 System.out.println(book2.getNumber());27 System.out.println(book2.getCompany());28 System.out.println(book2.getAuthor());29 30 System.out.println("==================");31 32 Book book3=book1.DepthClone();          //实例化一个book3,调用book1的深层克隆方法33 author.add("KZMASTER");              //修改book1的引用值,book3没有变化34 System.out.println(book1.getAuthor());35 System.out.println(book3.getAuthor());36 }37 }

应用场景:在某些情况下,被创建的对象,不仅仅想拥有其基类的数据结构,也想继承其基类的数据,这时候可以考虑原型模式。

深度克隆,可以保证原对象和克隆出来的新对象,完全互不影响

克隆的方法是在对象类中实现的。

 

转载于:https://www.cnblogs.com/WhiteTaken/p/6408028.html

你可能感兴趣的文章
linux top命令详解
查看>>
博弈论小结
查看>>
模拟Post登陆带验证码的网站
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
canvas动画
查看>>
4,7周围玩家
查看>>
关于webpack升级过后不能打包的问题;
查看>>
vue - 生命周期
查看>>
Python正则表达式
查看>>
Linux进程间通信--命名管道
查看>>
UVa 10970 - Big Chocolate
查看>>
js输出
查看>>
H5多文本换行
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>