設計模式 - 原型模式 (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的管理/調度中心
    • 可以使用工廠模式製作

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)