Prototype Pattern
雛形樣板(Prototype Pattern)是一種自我複製的架構,將原型的物件自我複製來生成一個全新的物件,在遊戲程式設計,已經廣泛的使用。複製最有名的方法可以分為淺度複製(Shallow copy)和深度複製(Deep copy)。(1)淺度複製 : 當複製的對象為值型別(value type)就直接複製其值; 如果複製對象是參考值(reference value )只會複製它的參考值,不會複製內容。
(2)深層複製 : 不管對象是值型別(value type)還是參考值(reference value )它都會完整複製其內容。
(3)管理的層面: 當我們複製新的物件時,如何去管理這些物件。
架構圖:
例子:
我們製作一款遊戲,當主角遇到妖怪時,妖怪會使用兩種分身術來迎戰,第一種分身為淺分身術,當其中有一個妖怪死完就過關。第二種分身為深度分身術,需要將所有的妖怪殺死才會過關。利用prototype來設計妖怪的分身術的方法。
第一種:淺分身術
public class Monster implements Cloneable{ // Data field private String name ; //名稱 private MonsterBlood blood ; //血量 public Monster(String name ) { this.name = name ; this.blood = new MonsterBlood(10000); } // Sallow Copy Method public Object clone() { try { System.out.println("妖怪 使用分身術"); return super.clone() ; } catch (Exception e) { return null ; } } //被攻擊 public void hurtSelf(Integer blood) { this.blood.setBlood(this.blood.getBlood()-blood) ; } public String toString() { String str = " Name:"+name+" ,blood:"+this.blood.getBlood() ; return str ; } } |
public class TestMonster { public static void main(String[] args) { System.out.println("主角遇到妖怪 !!"); //妖怪宣告 Monster monster1 = new Monster("水怪") ; Monster monster2 = (Monster)monster1.clone() ; System.out.println("Monster_1:" + monster1.toString()); System.out.println("Monster_2:" + monster2.toString()); System.out.println("主角使用絕招 !!"); monster1.hurtSelf(10000); System.out.println("Monster_1:" + monster1.toString()); System.out.println("Monster_2:" + monster2.toString()); } |
第二種:深分身術
它會實際物件完全產生一個新的實體,當參照改變時,複製的實體並不會被改變內容。
public class Monster2 implements Cloneable{ // Data field private String name ; //名稱 private MonsterBlood blood ; //血量 public Monster2(String name ) { this.name = name ; this.blood = new MonsterBlood(10000); } // Sallow Copy Method public Object clone() { try { System.out.println("妖怪 使用分身術"); Monster2 monster = new Monster2(name) ; return monster ; } catch (Exception e) { return null ; } } //被攻擊 public void hurtSelf(Integer blood) { this.blood.setBlood(this.blood.getBlood()-blood) ; } public String toString() { String str = " Name:"+name+" ,blood:"+this.blood.getBlood() ; return str ; } } |
public class TestMonster { public static void main(String[] args) { System.out.println("主角遇到妖怪 !!"); //妖怪宣告 Monster monster1 = new Monster("水怪") ; Monster monster2 = (Monster)monster1.clone() ; System.out.println("Monster_1:" + monster1.toString()); System.out.println("Monster_2:" + monster2.toString()); System.out.println("主角使用絕招 !!"); monster1.hurtSelf(10000); System.out.println("Monster_1:" + monster1.toString()); System.out.println("Monster_2:" + monster2.toString()); } |
留言
張貼留言