建造者模式与原型模式/builder模式与prototype模式/创建型模式

时间:2023-03-08 18:06:51
建造者模式与原型模式/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;
}
}