设计模式~原始模型模式(二)
时间:2022-07-23
本文章向大家介绍设计模式~原始模型模式(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这里给出一个原始模型模式的例子。孙大圣的身外身法术
浅复制
设计图如下:
TheGreatestSage类扮演客户角色。
TheGreatestSage类
package com.vincent.prototype;
public class TheGreatestSage {
private Monkey monkey = new Monkey();
public void change(){
Monkey copyMonkey;
for(int i=0;i<2000;i++){};
copyMonkey = (Monkey)monkey.clone();
System.out.println("Monkey King's birth date="+monkey.getBirthDate());
System.out.println("Copy monkey's birth date="+copyMonkey.getBirthDate());
System.out.println("Monkey King == Copy Monkey?"+(monkey==copyMonkey));
System.out.println("Monkey King's Staff==Copy Monkey's Staff?"+(monkey.getStaff()==copyMonkey.getStaff()));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TheGreatestSage sage = new TheGreatestSage();
sage.change();
}
}
Monkey类
package com.vincent.prototype;
import java.util.Date;
public class Monkey implements Cloneable {
private int height;
private int weight;
private GoldRingedStaff staff;
private Date birthDate;
/**
* 构造函数
*/
public Monkey(){
this.birthDate = new Date();
}
public Object clone(){
Monkey temp = null;
try{
temp = (Monkey)super.clone();
}catch(CloneNotSupportedException e){
System.out.println("Clone failed");
}finally{
return temp;
}
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public GoldRingedStaff getStaff() {
return staff;
}
public void setStaff(GoldRingedStaff staff) {
this.staff = staff;
}
}
GoldRingedStaff类
package com.vincent.prototype;
public class GoldRingedStaff {
private float height = 100.F;
private float diameter = 10.F;
/**
* 构造函数
*/
public GoldRingedStaff(){
// write your code here
}
/**
* 增长行为
*/
public void grow(){
this.diameter *=2.0;
this.height *=2.0;
}
/**
* 缩小行为
*/
public void shrink(){
this.diameter /= 2;
this.height /= 2;
}
public void move(){
//wirte you code for moving the staff
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getDiameter() {
return diameter;
}
public void setDiameter(float diameter) {
this.diameter = diameter;
}
}
运行结果如下:
Monkey King's birth date=Fri Aug 14 07:15:59 CST 2020 Copy monkey's birth date=Fri Aug 14 07:15:59 CST 2020 Monkey King == Copy Monkey?false Monkey King's Staff==Copy Monkey's Staff?true
深复制
为做到深复制,所有需要复制的对象需要实现 java.io.Serializable接口。
系统设计如下:
TheGreatestSage类
package com.vincent.prototype;
import java.io.IOException;
public class TheGreatestSage {
private Monkey monkey = new Monkey();
public void change() throws IOException,ClassNotFoundException{
Monkey copyMonkey;
for(int i=0;i<2000;i++){};
copyMonkey = (Monkey)monkey.deepClone();
System.out.println("Monkey King's birth date="+monkey.getBirthDate());
System.out.println("Copy monkey's birth date="+copyMonkey.getBirthDate());
System.out.println("Monkey King == Copy Monkey?"+(monkey==copyMonkey));
System.out.println("Monkey King's Staff==Copy Monkey's Staff?"+(monkey.getStaff()==copyMonkey.getStaff()));
}
public static void main(String[] args) throws IOException,ClassNotFoundException{
// TODO Auto-generated method stub
TheGreatestSage sage = new TheGreatestSage();
sage.change();
}
}
Monkey
package com.vincent.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
import java.util.Date;
public class Monkey implements Cloneable,Serializable {
private int height;
private int weight;
private GoldRingedStaff staff;
private Date birthDate;
/**
* 构造函数
*/
public Monkey(){
this.birthDate = new Date();
this.staff = new GoldRingedStaff();
}
/**
* 深克隆方法
* @return
* @throws IOException
* @throws OptionalDataException
* @throws ClassNotFoundException
*/
public Object deepClone() throws IOException,OptionalDataException,ClassNotFoundException
{
//首先将对象写出到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
//然后将对象从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
/**
* 浅克隆方法
*/
public Object clone(){
Monkey temp = null;
try{
temp = (Monkey)super.clone();
}catch(CloneNotSupportedException e){
System.out.println("Clone failed");
}finally{
return temp;
}
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public GoldRingedStaff getStaff() {
return staff;
}
public void setStaff(GoldRingedStaff staff) {
this.staff = staff;
}
}
GoldRingedStaff
package com.vincent.prototype;
import java.io.Serializable;
public class GoldRingedStaff implements Cloneable,Serializable{
private float height = 100.F;
private float diameter = 10.F;
/**
* 构造函数
*/
public GoldRingedStaff(){
// write your code here
}
/**
* 增长行为
*/
public void grow(){
this.diameter *=2.0;
this.height *=2.0;
}
/**
* 缩小行为
*/
public void shrink(){
this.diameter /= 2;
this.height /= 2;
}
public void move(){
//wirte you code for moving the staff
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getDiameter() {
return diameter;
}
public void setDiameter(float diameter) {
this.diameter = diameter;
}
}
结果如下:
Monkey King's birth date=Fri Aug 14 07:37:04 CST 2020 Copy monkey's birth date=Fri Aug 14 07:37:04 CST 2020 Monkey King == Copy Monkey?false Monkey King's Staff==Copy Monkey's Staff?false
- 跟着柴毛毛学Spring(1)——纵观Spring
- MYSQL常用SQL汇总
- Linux 下设置SVN DIFF
- 剑指 offer代码解析——面试题38数字在排序数组中出现的次数
- 剑指 offer代码解析——面试题37两个链表的第一个公共结点
- 剑指 offer代码解析——面试题34丑数
- 剑指 offer代码解析——面试题35第一个只出现一次的字符
- Python内置数据结构之集合
- 剑指 offer代码解析——面试题32统计1到n中1出现的次数
- 剑指 offer代码解析——面试题26复杂链表的复制
- Linux软件安装(二)——RPM与YUM
- linux软件安装(一)——源码安装
- 利用LUA协程实现FUTURE模式
- Python内置数据结构之字典(完整版)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法