磊哥學設計模式(三)抽象工廠模式
阿新 • • 發佈:2018-11-09
抽象工廠
什麼是抽象工廠
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。
為什麼使用抽象工廠
主要解決介面選擇的問題,系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
程式碼演示
同樣,拿遊戲來舉例,現在,有兩個鐵匠鋪,一個生產武器,一個生產裝備,那麼就像上一節一樣,用兩個介面就好了:
武器:
public interface weapon {
void Produceweapon();
}
武器工廠裡面生產兩種武器,一個劍一個刀:
public class Sword implements weapon {
@Override
public void Produceweapon() {
// TODO Auto-generated method stub
System.out.println("Produce a sword!");
}
}
public class knife implements weapon { @Override public void Produceweapon() { // TODO Auto-generated method stub System.out.println("Produce a knife!"); } }
裝備:
public interface Armor {
void ProduceArmor();
}
裝備裡面也產兩種裝備,一個頭盔,一個胸甲:
public class breastplate implements Armor {
@Override
public void ProduceArmor() {
// TODO Auto-generated method stub
System.out.println("Produce a breastplate!");
}
}
public class helmet implements Armor { @Override public void ProduceArmor() { // TODO Auto-generated method stub System.out.println("Produce a helmet!"); } }
好,這時候,遊戲要統一管理,出來一個裝備工廠,這兩個工廠邊成他的子廠,那麼這個管理的工廠怎麼寫呢?
用一個抽象類就可以了:
public abstract class forge {
public abstract weapon getWeapon(String type);
public abstract Armor getArmor(String type);
}
然後對抽象類實現,選擇用哪個工廠的裝備:
public class ForgeFactory {
public static forge getfactory(String type){
if(type.equalsIgnoreCase("armor")){
return new ArmorFactory();
}else if(type.equalsIgnoreCase("weapon")){
return new WeaponFactory();
}
return null;
}
}
public class ArmorFactory extends forge {
@Override
public weapon getWeapon(String type) {
// TODO Auto-generated method stub
return null;
}
@Override
public Armor getArmor(String type) {
// TODO Auto-generated method stub
if(type.equalsIgnoreCase("breastplate")){
return new breastplate();
}else if(type.equalsIgnoreCase("helmet")){
return new helmet();
}
return null;
}
}
public class WeaponFactory extends forge {
@Override
public weapon getWeapon(String type) {
// TODO Auto-generated method stub
if(type.equalsIgnoreCase("sword")){
return new Sword();
}else if(type.equalsIgnoreCase("knife")){
return new knife();
}
return null;
}
@Override
public Armor getArmor(String type) {
// TODO Auto-generated method stub
return null;
}
}
到這裡,我們的抽象工廠就完成了,以後要用哪個裝備,通過抽象工廠,直接選用就可以了:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
forge armorfactory = ForgeFactory.getfactory("armor");
Armor a= armorfactory.getArmor("breastplate");
a.ProduceArmor();
Armor b=armorfactory.getArmor("helmet");
b.ProduceArmor();
forge weaponfactory = ForgeFactory.getfactory("weapon");
weapon c=weaponfactory.getWeapon("sword");
c.Produceweapon();
weapon d= weaponfactory.getWeapon("knife");
d.Produceweapon();
}
}
通過程式碼,可以更直觀的理解,抽象工廠是生產其他工廠的工廠這句話。