建造者模式与原型模式/builder模式与prototype模式/创建型模式
建造者模式
定义
用于简化复杂对象的创建
JDK中的建造者模式
java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身。
public StringBuilder append(String str) {
super.append(str);
return this;
}
//父类AbstractStringBuilder
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
建造者模式和工厂模式的区别
建造者模式将很多功能集成到一个类里,这个类可以创造出比较复杂的东西。
所以与工程模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。
因此,是选择工厂模式还是建造者模式,依实际情况而定。
原型模式
定义
原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,
对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。
在Java中,复制对象是通过clone()实现的,先创建一个原型类:
class Prototpye1 implements Cloneable{
public Object clone() throws CloneNotSupportedException{
Prototpye proto=(Prototpye)super.clone();
return proto;
}//浅复制
//因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的
}
深复制和浅复制
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。`
class SerializableObject implements Serializable{
private static final long serialVersionUID=1l; {
}
}
public class Prototpye implements Cloneable,Serializable{
private static final long serialVersionUID=1L;
private String string;
private SerializableObject obj;
//浅复制.利用Object的clone()方法
public Object clone()throws CloneNotSupportedException {
Prototpye proto=(Prototpye)super.clone();
return proto;
}
//要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。
public Object deepClone()throws IOException ,ClassNotFoundException{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String str) {
this.string=str;
}
public SerializableObject getObj() {
return obj;
}
}
I am a slow walker, but I never walk backwards.