java設計模式學習總結--原型模式

2020-08-11 18:04:04

原型模式(Prototype Partten)

   定義:以現有的某個範例爲原型,通過複製原型獲得更多相同或相似的物件。

   特點:

  1. 通過clone生成新物件;
  2. 可以跳過一系列構建條件,物件生成較爲便捷快速;

   實現:

     原型模式是最建立型設計模式,以現有的範例爲原型,通過複製,高效快速地生成新物件,特別是在一些需要生成大量物件的場景(將大量數據庫數據對映成實體物件時),使用原型模式生成物件要比new的方式更爲高效。原型模式的克隆分爲淺克隆和深克隆,在java中原型類直接實現Cloneable 介面就可實現物件的克隆

  1.淺克隆

package design.prototype;

import java.util.Arrays;

public class Prototype implements Cloneable {
	private String name;
	private String[] strs;

	public String[] getStrs() {
		return strs;
	}

	public void setStrs(String[] strs) {
		this.strs = strs;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Prototype ptt = (Prototype) super.clone();
		ptt.setName(this.name);
		ptt.setStrs(this.strs);
		return ptt;
	}

	public void print() {
		System.out.println(this.name + "--" + Arrays.toString(this.strs)+"--"+this.strs.toString());
	}

}

2.深克隆

package design.prototype;

import java.util.Arrays;

public class Prototype implements Cloneable {
	private String name;
	private String[] strs;

	public String[] getStrs() {
		return strs;
	}

	public void setStrs(String[] strs) {
		this.strs = strs;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Prototype ptt = (Prototype) super.clone();
		ptt.setName(this.name);
		ptt.setStrs(this.strs.clone());
		return ptt;
	}

	public void print() {
		System.out.println(this.name + "--" + Arrays.toString(this.strs)+"--"+this.strs.toString());
	}

}

 

package design.prototype;

public class Test {

	public static void main(String[] args) {
		Prototype p1 = new Prototype();
		String[] t = { "1", "1" };
		p1.setName("l");
		p1.setStrs(t);
		Prototype p2;
		try {
			p2 = (Prototype) p1.clone();
			p1.print();
			p2.print();
			// 對p2.進行修改
			String[] t1 = p2.getStrs();
			t1[0] = "222";
			p2.setStrs(t1);
			p1.print();
			p2.print();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}

}

用上面的Test.java進行測試:

1.淺克隆下的輸出:

l--[1, 1]--[Ljava.lang.String;@15db9742
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@15db9742

2.深克隆下的輸出:

l--[1, 1]--[Ljava.lang.String;@15db9742
l--[1, 1]--[Ljava.lang.String;@6d06d69c
l--[1, 1]--[Ljava.lang.String;@15db9742
l--[222, 1]--[Ljava.lang.String;@6d06d69c

         可以看到,在淺克隆中對於陣列strs 的克隆只是將陣列地址複製到了新物件中,並未建立新的陣列,也就是說淺克隆只克隆你指定的物件,至於你指定的物件內部的物件,它不克隆,還是把參照給你,共用變數。在使用時需注意,如果需要克隆指定的物件內部的物件,那就需要在clone方法內,範例化內部物件或者呼叫內部物件的clone方法