抽象原廠模式是建立型模式之一。建立型模式有原廠模式(抽象工廠、Factory 方法)、產生器模式、單體模式、原型模式四種。下面我來簡單分析一下抽象原廠模式。
抽象原廠模式的定義是建立一個提供一系列相關或相互依賴對象的介面,而無需指定它們具體的類。所有的建立型模式有一個特點,我們不關心工廠生產出來的具體對象的類型,我們會將其具體的類與工廠分離開來。這麼說的話,很抽象難懂,下面是一個關於星際爭霸的例子。
在遊戲星際爭霸中,人族的兵營可以生產兩種兵:機槍兵和火焰兵,機槍兵能夠用機槍攻擊,火焰兵能夠用火焰槍來攻擊。我們需要構建一個兵營,使得能夠生產這兩種兵,並且他們都有著自己的攻擊方法。
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方法聲明,這是不利於我們進行擴充的。也就是說,它難以支援新種類的產品。