设计模式之---原型模式

来源:互联网 发布:剑三五毒捏脸数据 编辑:程序博客网 时间:2024/06/11 07:30


1)什么是原型?

a、开发项目前用Axure设计的原型是项目的原型

b、中国的现代化发展向美国等先进国家学习,它们是中国的发展的原型

c、孩子学步说话,父母亲人是他的原型


2)为什么要用原型设计呢?(什么时候用?)

a、在Java中提供一个原型对象,可以不去关注原型对象的类型,不关注new关键字,顺便拷贝原型拥有的属性等信息

b、项目的原型就是项目真正开始开发前的需求确认


3)怎么使用呢?

a、使用Java-祖宗类Object的clone()接口实现浅克隆

b、使用序列化接口实现深度克隆


4)什么是浅度克隆?什么是深度克隆?

a、浅度克隆:只克隆原型对象的 基本属性(如基本类型、字符串),无法克隆引用类型

b、深度克隆:克隆原型对象的 基本属性 + 引用类型


5)具体实现代码如下:

Book

package com.wendy.protype.dto;import java.io.Serializable;public class Book implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String name;private float price;private String autor;public String getName() {return name;}public void setName(String name) {this.name = name;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public String getAutor() {return autor;}public void setAutor(String autor) {this.autor = autor;}}

User

package com.wendy.protype.dto;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class User implements Cloneable,Serializable{/** *  */private static final long serialVersionUID = 1L;private String name;private int age;private String address;private int sex;private Book book;public Book getBook() {return book;}public void setBook(Book book) {this.book = book;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}public Object deepClone() throws IOException, ClassNotFoundException{// 将对象写到流里ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return ois.readObject();}}


Client

package com.wendy.protype;import java.io.IOException;import com.wendy.protype.dto.Book;import com.wendy.protype.dto.User;public class Client {public static void main(String[] args) {Book book = new Book();book.setPrice(28);book.setAutor("程序员");User user = new User();user.setBook(book);user.setName("Zemel");user.setAge(26);user.setSex(1);user.setAddress("天河车陂");// 浅度克隆//User cloneUser = null;//try {//cloneUser = (User)user.clone();//} catch (CloneNotSupportedException e) {//// TODO Auto-generated catch block//e.printStackTrace();//}//book.setName("大话设计模式");//System.out.println(cloneUser == user);////System.err.println(cloneUser.getName());//System.err.println(cloneUser.getBook().getName());// 深度克隆User cloneUser = null;try {cloneUser = (User)user.deepClone();}  catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}book.setName("大话设计模式");System.err.println(user.getBook().getName());System.err.println(cloneUser == user);System.err.println(cloneUser.getName());System.err.println(cloneUser.getBook().getName());}}


PS:浅克隆 需要实现 接口 Clonable,意思是告诉Jvm这个对象可以放心克隆,否则异常

        深度克隆 需要实现 接口Serializable,意思是通过序列化克隆,否则异常




原创粉丝点击