設計模式 - 原型模式 (Creational Patterns - Prototype Pattern)
原型模式的使用時機
- 當今天想要複製一個模型裡面的屬性時
- 並且複製的是原本物件的全部屬性
- 當今天new可能會造成危害時
設計方法
- 確保物件有clone方法
- 可以克制化或是繼承java.lang的Cloneable介面,直接使用Java物件之母的Object.clone功能
- 使用Object.clone功能必須以super的方式調度父類別
- 設計原型模式中心,可以進行調控(可能是工廠模式)
- 客戶端使用原型模式中心取出的物件,取代new出物件
範例
英雄訓練營可以訓練並且可以複製使用者覺得優秀的英雄,在此範例因為屬性過少所以感覺不到prototype的威力,當今天屬性變多後,使用prototype模式就不用慢慢地set屬性了。
class Hero implements Cloneable {
//Prototype
private String weapon;
public String getWeapon() {
return weapon;
}
public void setWeapon(String weapon) {
this.weapon = weapon;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class HeroCam {
// Prototype registry
public Hero makeHero() {
return new Hero();
}
public Hero cloneHero(Hero hero) throws CloneNotSupportedException {
return (Hero) hero.clone();
}
}
public class Prototype {
public static void main(String[] args) {
HeroCam heroCam = new HeroCam();
try {
Hero hero = heroCam.makeHero();
hero.setWeapon("Magic");
Hero newHero = heroCam.cloneHero(hero);
System.out.println(hero.getWeapon());
System.out.println(newHero.getWeapon());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
結論
- 若今天有需要複製物件的需求可以使用Prototype Design Pattern
- 若是Prototype過多可以參考上面範例在創造一個Prototype的管理/調度中心
- 可以使用工廠模式製作
留言
張貼留言