• 建造者模式与原型模式/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.



  • 相关阅读:
    《神经网络论文精读》
    刻意练习
    马斯洛模型
    MRP执行计划列表(禁用)
    生产齐套分析
    BZOJ 3589: 动态树 树链剖分+线段树+树链的并
    CF1043F Make It One 容斥+dp+组合
    CF1073D Berland Fair 二分+线段树
    BZOJ 5084: hashit 后缀自动机(原理题)
    BZOJ 3991: [SDOI2015]寻宝游戏 树链的并+set
  • 原文地址:https://www.cnblogs.com/lknny/p/4853581.html
Copyright © 2020-2023  润新知