設計模式之抽象工廠模式

剛看到抽象工廠模式,發現抽象工廠模式是很想的,抽象工廠模式定義如下:爲創建一組相關或相互依賴的對象提供一個接口,而且不需要指定它們的具體類


抽象工廠模式的通用類圖如下:




每一個模式都是針對一定問題的解決方案。抽象工廠模式與工廠方法模式的最大區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則需要面對多個產品等級結構


下面用一個汽車製造的例子來說一下抽象工廠模式


汽車製造類圖如下:




汽車的製造主要有:發動機、輪胎、車門、座椅等等,本例之介紹發動機和輪胎的製造

現在要生產兩種車輛:寶馬和奔馳,寶馬和奔馳的發動機和輪胎都有各自的要求,所以提取抽象,即發動機Engine和輪胎抽象類Tire,具體的區別交由各自的實現類,根據抽象工廠模式的定義,既然存在不同的產品,那麼就需要不同的工廠負責生產。


具體代碼如下:


/**
 * 發動機抽象類
 *
 */
public abstract class Engine {

    //抽象邏輯定義
}


/**
 *寶馬汽車的發動機 
 *
 */
public class BMWEngine extends Engine {

}

/**
 * 奔馳汽車的發動機
 *
 */
public class BenzEngine extends Engine {

}

/**
 * 發動機工廠的抽象類
 *
 */
public abstract class EngineFactory {

    public abstract Engine createEngine();
}

/**
 * 寶馬發動機工廠類
 *
 */
public class BMWEngineFactory extends EngineFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.EngineFactory#createEngine()
     */
    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new BMWEngine();
    }

}

/**
 * 奔馳發動機的工廠類
 *
 */
public class BenzEngineFactory extends EngineFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.EngineFactory#createEngine()
     */
    @Override
    public Engine createEngine() {
        // TODO Auto-generated method stub
        return new BenzEngine();
    }

}

/**
 *汽車輪胎的抽象類 
 *
 */
public abstract class Tire {

    //抽象邏輯定義,例如生產輪胎的尺寸,材質等等
}

/**
 * 寶馬輪胎
 *
 */
public class BMWTire extends Tire {

}

/**
 * 
 *奔馳輪胎
 */
public class BenzTire extends Tire {

}

/**
 * 輪胎的抽象工廠類
 *
 */
public abstract class TireFactory {

    public abstract Tire createTire();
}

/**
 * 寶馬輪胎工廠類
 *
 */
public class BMWTireFactory extends TireFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.TireFactory#createTire()
     */
    @Override
    public Tire createTire() {
        // TODO Auto-generated method stub
        return new BMWTire();
    }

}

/**
 * 奔馳輪胎工廠類
 *
 */
public class BenzTireFactory extends TireFactory {

    /**
     * @return
     * @see com.huashao.chapter.car.TireFactory#createTire()
     */
    @Override
    public Tire createTire() {
        // TODO Auto-generated method stub
        return new BenzTire();
    }

}

public class CarEngineer {
    
    private String carType;

    private Engine engine;

    private Tire tire;

    private EngineFactory engineFactory;

    private TireFactory tireFactory;
    
    public void createCar(){
        
        if("BMW".equalsIgnoreCase(carType)){
            engineFactory=new BMWEngineFactory();
            
            engine=engineFactory.createEngine();
            
            tireFactory=new BMWTireFactory();
            
            tire=tireFactory.createTire();
        }
        
        if("Benz".equalsIgnoreCase(carType)){
            engineFactory=new BenzEngineFactory();
            
            engine=engineFactory.createEngine();
            
            tireFactory=new BenzTireFactory();
            
            tire=tireFactory.createTire();
        }
    }
}


抽象工廠模式的優點:

良好的封裝,客戶端不需要關心具體的實現類,客戶端只需要關注接口即可


抽象工廠模式的缺點:

不易擴展新產品,例如上面汽車製造的例子,如果現在增加一個車門的製造,那麼我們需要定義一個車門的抽象類,定義寶馬和奔馳的車門實現類,增加車門的抽象工廠類,定義寶馬和奔馳車門生產的工廠類,如果不止這兩種車呢?想想吧,我們需要寫多少類



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