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

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

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

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

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

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

直接上代码。

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

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

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

 import java.util.ArrayList;
import java.util.List; public class Book implements Cloneable{  //原型模式需要实现cloneable接口
private String name;
private int number;
private String company;
private List<String> author;      //指向的是一个引用的空间
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
} public List<String> getAuthor() {
return author;
}
public void setAuthor(List<String> author) {
this.author = author;
} //浅层克隆,clone以后引用会保持一致,当引用对象发生改变,两个克隆对象就会发生改变
public Book ShallowClone(){
try {
return (Book) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
//深度克隆,需要对有引用的地方进行操作
public Book DepthClone(){
try {
Book book=(Book)super.clone();
List<String> authors=new ArrayList<String>();
for(String author:this.getAuthor()){
authors.add(author);
}
book.setAuthor(authors);
return book;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}

4.主客户端测试代码

 import java.util.ArrayList;
import java.util.List; //原型模式也叫克隆模式
public class MainClass {
public static void main(String[] args) {
Book book1=new Book();       //实例化一个book1
book1.setName("shujujiegou");
book1.setNumber();
book1.setCompany("TomCompany");
List<String>author=new ArrayList<>();
author.add("Tom");
author.add("WhiteTaken");
book1.setAuthor(author); Book book2=book1.ShallowClone();        //实例化一个book2,调用book1的浅层克隆方法
book1.setName("数据结构");            //浅层克隆,引用指向同一个,但是String等类型的值直接克隆
author.add("Langer");              //修改book1的值,浅层克隆book1和book2指向的是同一个引用,打印的值相同 System.out.println(book1.getName());
System.out.println(book1.getNumber());
System.out.println(book1.getCompany());
System.out.println(book1.getAuthor()); System.out.println(book2.getName());
System.out.println(book2.getNumber());
System.out.println(book2.getCompany());
System.out.println(book2.getAuthor()); System.out.println("=================="); Book book3=book1.DepthClone();          //实例化一个book3,调用book1的深层克隆方法
author.add("KZMASTER");              //修改book1的引用值,book3没有变化
System.out.println(book1.getAuthor());
System.out.println(book3.getAuthor());
}
}

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

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

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

(@WhiteTaken)设计模式学习——原型模式的更多相关文章

  1. swift设计模式学习 - 原型模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 定义 用原型实例指定创建对象的种类,并且通 ...

  2. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  3. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  4. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  5. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  6. java设计模式4——原型模式

    java设计模式4--原型模式 1.写在前面 本节内容与C++语言的复制构造函数.浅拷贝.深拷贝极为相似,因此建议学习者可以先了解C++的该部分的相关知识,或者学习完本节内容后,也去了解C++的相应内 ...

  7. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  8. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  9. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

随机推荐

  1. MySQL索引背后的之使用策略及优化(高性能索引策略)

    为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库关系复杂度适中,且数据量较大.下图是这个数据库的E-R关系图(引 ...

  2. lPC1788驱动SDRAM

    Sdram型号为hy57v256 #ifndef __SRAM_H_ #define __SRAM_H_ #include "common.h" #include "de ...

  3. LPC1768的SPI通讯

    SPI是一种全双工串行接口,可处理多个连接到指定总线上的主机和从机.在数据传输过程中总线上只能有一个主机和一个从机通信.在数据传输中,主机总是会向从机发送一帧8到16个位的数据,而从机也总会向主机发送 ...

  4. Mapreduce TopK

      思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...

  5. Android小功能之垂直滚动条

    <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...

  6. matlab unique 顺序不变

    对于一个向量,使用unique去重后会自动排序,为了保持原顺序: A = [5,1,8,5,2,8,3,9,6,1];[i,j] = unique(A,'first');B = A(sort(j)); ...

  7. 开源免费的C/C++网络库(c/c++ sockets library)补充

    (1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boo ...

  8. IOS开发-OC学习-MD5加密

    MD5的全称是Message-Digest Algorithm 5. MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据 ...

  9. WebForm和MVC中都可以使用的路由

    1.在global.asax void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 // RouteConfig. ...

  10. python获取绑定的IP,并动态指定出口IP

    在做采集器的过程中,经常会遇到IP限制的情况,这时候可以通过切换IP能继续访问. 如果是多IP的服务器,那么可以通过切换出口Ip来实现. 1.首先是如何获取服务器绑定的IP import netifa ...