设计模式之---原型模式
来源:互联网 发布:剑三五毒捏脸数据 编辑:程序博客网 时间: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,意思是通过序列化克隆,否则异常
阅读全文
0 0
- 设计模式之原型
- 设计模式之原型
- 设计模式 之 原型
- 设计模式之原型
- 设计模式之原型
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之-原型模式
- 设计模式之 原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之--原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 安装TensorFlow
- OC代码编译,链接,执行过程 02
- TCP网络编程中的listen
- Climbing Stairs
- IE浏览器调用OCX控件的一般方法
- 设计模式之---原型模式
- 杂花生树(四十三)
- msyql 并发相关参数
- linux的php-fpm
- CString成员函数
- 【编程题】黑白卡片
- 银行家算法
- Executor框架
- 在windows下atom上搭建PlantUML书写环境