构造型模式

[b]Builder(生成器)模式[/b]

[b]Factory Method(工厂方法)模式[/b]

意图:用于创建对象的接口,同时控制对哪个类进行实例化。


[b]Abstract Factory(抽象工厂)模式[/b]

意图:创建一系列相互关联或相互依赖的对象。

[b]Prototype(原型)模式[/b]

prototype模式不通过实例化类来创建一个新的未初始化的实例,而是通过复制一个现有对象来生成新的对象。

[img]http://dl.iteye.com/upload/attachment/551490/be5f7fc1-8825-3ae6-806a-b3d22cd5307e.png[/img]
[i]浅拷贝[/i]

public class PackageInfo implements Cloneable {
private Long id;
private String receiverName;
private String receiverAddress;
private String senderName;
private String senderPhoneNo;

//other fields, getters, setters and other methods...


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getReceiverName() {
return receiverName;
}

public void setReceiverName(String receiverName) {
this.receiverName = receiverName;
}

public String getReceiverAddress() {
return receiverAddress;
}

public void setReceiverAddress(String receiverAddress) {
this.receiverAddress = receiverAddress;
}

public String getSenderName() {
return senderName;
}

public void setSenderName(String senderName) {
this.senderName = senderName;
}

public String getSenderPhoneNo() {
return senderPhoneNo;
}

public void setSenderPhoneNo(String senderPhoneNo) {
this.senderPhoneNo = senderPhoneNo;
}

public PackageInfo clone() {
try {
return (PackageInfo)super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("Cloning not allowed.");
return null;
}
}


public static PackageInfo clonePackage(String userName) {
//load package as prototype data from db...
PackageInfo prototype = loadPackageInfo(userName);

//clone information...
prototype = prototype.clone();

//initialize copied data...
prototype.setId(null);

return prototype;
}

//Simulate loading data from database
private static PackageInfo loadPackageInfo(String userName) {
PackageInfo packageInfo = new PackageInfo();

//create a String object in jvm heap not jvm string pool
packageInfo.setId(100l);
packageInfo.setReceiverName("John");
packageInfo.setReceiverAddress("People Square,Shanghai");
packageInfo.setSenderName("William");
packageInfo.setSenderPhoneNo("12345678901");
return packageInfo;
}
}
public class PackageInfoTestDrive {
public static void main(String[] args) {
PackageInfo currentInfo = PackageInfo.clonePackage("John");
System.out.println("Original package information:");
display(currentInfo);

currentInfo.setId(10000l);
currentInfo.setReceiverName("Ryan");
currentInfo.setReceiverAddress("People Square, Shanghai");

System.out.println("\nNew package information:");
display(currentInfo);
}

private static void display(PackageInfo currentInfo) {
System.out.println("Package id: " + currentInfo.getId());
System.out.println("Receiver name: " + currentInfo.getReceiverName());
System.out.println("Receiver address: " + currentInfo.getReceiverAddress());
System.out.println("Sender name: " + currentInfo.getSenderName());
System.out.println("Sender Phone No.: " + currentInfo.getSenderPhoneNo());
}
}

[i]深拷贝(Deep Copy)[/i]

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 DeepCopyBean implements Serializable {
private String objectField;
private int primitiveField;

public String getObjectField() {
return objectField;
}

public void setObjectField(String objectField) {
this.objectField = objectField;
}

public int getPrimitiveField() {
return primitiveField;
}

public void setPrimitiveField(int primitiveField) {
this.primitiveField = primitiveField;
}

public DeepCopyBean deepCopy() {
try {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream o = new ObjectOutputStream(buf);
o.writeObject(this);

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
return (DeepCopyBean) in.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
public class DeepCopyBeanTestDrive {
public static void main(String[] args) {
DeepCopyBean originalBean = new DeepCopyBean();

//create a String object in jvm heap not jvm string pool
originalBean.setObjectField(new String("123456"));
originalBean.setPrimitiveField(2);

//clone this bean
DeepCopyBean newBean = originalBean.deepCopy();

System.out.println("Primitive ==? " + (newBean.getPrimitiveField() == originalBean.getPrimitiveField()));
System.out.println("Object ==? " + (newBean.getObjectField() == originalBean.getObjectField()));
System.out.println("Object equal? " + (newBean.getObjectField().equals(originalBean.getObjectField())));
}
}



[b]Memento(备忘录)模式[/b]

意图:为对象提供状态存储和状态恢复功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值