Java設計模式之從[星際爭霸1]分析抽象工廠模式

  抽象工廠模式是創建型模式之一。創建型模式有工廠模式(抽象工廠、工廠方法)、生成器模式、單體模式、原型模式四種。下面我來簡單分析一下抽象工廠模式。

  抽象工廠模式的定義是創建一個提供一系列相關或相互依賴對象的接口,而無需指定它們具體的類。所有的創建型模式有一個特點,我們不關心工廠生產出來的具體對象的類型,我們會將其具體的類與工廠分離開來。這麼說的話,很抽象難懂,下面是一個關於星際爭霸的例子。

  在遊戲星際爭霸中,人族的兵營可以生產兩種兵:機槍兵和火焰兵,機槍兵能夠用機槍攻擊,火焰兵能夠用火焰槍來攻擊。我們需要構建一個兵營,使得能夠生產這兩種兵,並且他們都有着自己的攻擊方法。

  Java代碼如下:

interface SoldierFactory{
    Soldier ProduceMarine();
    Soldier ProduceFirebat();
}

interface Soldier{
    void attack();
}

class Marine implements Soldier{
    public void attack(){
        System.out.println("機槍兵用機槍掃射");
    }
}

class Firebat implements Soldier{
    public void attack(){
        System.out.println("火焰兵使用噴火槍進行攻擊");
    }
}

class Barracks implements SoldierFactory{
    public Soldier ProduceMarine(){
        System.out.println("生成了一個機槍兵");
        return new Marine();
    }
    
    public Soldier ProduceFirebat(){
        System.out.println("生成了一個火槍兵");
        return new Firebat();
    }
}

class Demo
{
    public static void main(String[] args) {
        Barracks myBarrack = new Barracks();
        Soldier marine = myBarrack.ProduceMarine();
        Soldier firebat = myBarrack.ProduceFirebat();
        marine.attack();
        firebat.attack();
    }
}

  抽象工廠SolderFactory接口聲明瞭兩種方法,生產機槍兵和生產火焰兵。每個兵種都能夠攻擊,因此它們均繼承於Soldier接口。我們定義了Marine和Firebat類,將這兩種兵種的行爲實現了。最後,爲了實現生產兵種,我們定義了一個兵營類Barracks,並實現了SolderFactory中的方法,分別在ProduceMarine和ProduceFirebat中實現了生產機槍兵和火焰兵的方法,並作爲方法的返回值返回。

  在main方法中,我們看到了,我們先實例化了一個兵營myBarracks,然後用ProduceMarine和ProduceFirebat實現了兵種的生產,最後我們可以調用兵種的attack方法來讓他們用自己的方式攻擊。

  這裏需要注意的是,我們在聲明marine和firebat對象時,我們始終用的是Soldier這個接口來定義的,而不是用它們具體的類(Marine、Firebat)來進行定義。爲什麼要這麼做?主要的原因還是爲了實現分離,降低代碼的耦合度;另外Marine和Firebat類,可能會存在別的方法,用Soldier來進行聲明的話,就只會把attack方法暴露給我們。

  抽象工廠模式的缺點也是顯而易見的。假設我們要爲工廠增加幽靈特工(Ghost,也就是我們俗稱的原子彈兵)和醫療兵,我們不得不修改SoldierFactory,爲它增加ProduceGhost和ProduceMedic方法聲明,這是不利於我們進行擴展的。也就是說,它難以支持新種類的產品。

 

 


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