建造者模式与原型模式/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;
	}
}
posted @ 2015-10-03 16:57  toto怎么会喝醉  阅读(371)  评论(0编辑  收藏  举报