建造者模式(Builder Pattern)案例解析

建造者模式(Builder Pattern)


定義:

將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示,構建者只需要完成構建步驟,真正的構建內容由其表示填充。


類圖:

案例描述:
有一個作戰平臺,上面可以安裝滿足其規格的任意一種武器,但僅限於一種,
所以作戰平臺可以根據需要替換不同武器。
對於作戰平臺來說,當需要攻擊一個目標時,他只需要向當前武器下達aim和fire兩條命令即可將目標摧毀(對作戰平臺來說,不同的武器對他並沒有區別),
而真正完成aim和fire的操作由當前武器自己完成,這也是作戰平臺上安裝的武器需要的規格,即可以自己在接受到aim和fire命令後完成摧毀目標的操作。

案例源碼:
/*
 * shsheng
 */
package DesignPatterns;

public class BuilderPattern {

    public static void main(String[] args) {
        CombatPlatform combatPlatform = new CombatPlatform(1);
        combatPlatform.changeWeapon(new Missile(1));
        combatPlatform.aim(new City(1));
        combatPlatform.fire();
        combatPlatform.changeWeapon(new Cannon(1));
        combatPlatform.aim(new City(2));
        combatPlatform.fire();
    }

    static class CombatPlatform {
        Weapon weapon;
        int num;

        public CombatPlatform(int num) {
            this.num = num;
        }

        public void changeWeapon(Weapon weapon) {
            System.out.println(this + "更換武器爲" + weapon + "!");
            this.weapon = weapon;
        }

        public void aim(Object obj) {
            System.out.println(this + "武器" + weapon.aim(obj));
        }

        public void fire() {
            System.out.println(this + "武器" + weapon.fire());
        }

        @Override
        public String toString() {
            return "作戰平臺" + num;
        }
    }

    static class City {
        int num;

        public City(int num) {
            this.num = num;
        }

        @Override
        public String toString() {
            return "城市" + num;
        }
    }

    static abstract class Weapon {
        public abstract String aim(Object obj);

        public abstract String fire();
    }

    static class Missile extends Weapon {
        int num;

        public Missile(int num) {
            this.num = num;
        }

        @Override
        public String aim(Object obj) {
            return (this + "鎖定" + obj + "!");
        }

        @Override
        public String fire() {
            return (this + "發射!");
        }

        @Override
        public String toString() {
            return "導彈" + num;
        }
    }

    static class Cannon extends Weapon {
        int num;

        public Cannon(int num) {
            this.num = num;
        }

        @Override
        public String aim(Object obj) {
            return (this + "瞄準" + obj + "!");
        }

        @Override
        public String fire() {
            return (this + "開炮!");
        }

        @Override
        public String toString() {
            return "大炮" + num;
        }
    }

}


運行結果:

作戰平臺1更換武器爲導彈1!
作戰平臺1武器導彈1鎖定城市1!
作戰平臺1武器導彈1發射!
作戰平臺1更換武器爲大炮1!
作戰平臺1武器大炮1瞄準城市2!
作戰平臺1武器大炮1開炮!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章