剛看到抽象工廠模式,發現抽象工廠模式是很想的,抽象工廠模式定義如下:爲創建一組相關或相互依賴的對象提供一個接口,而且不需要指定它們的具體類
抽象工廠模式的通用類圖如下:
每一個模式都是針對一定問題的解決方案。抽象工廠模式與工廠方法模式的最大區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則需要面對多個產品等級結構
下面用一個汽車製造的例子來說一下抽象工廠模式
汽車製造類圖如下:
汽車的製造主要有:發動機、輪胎、車門、座椅等等,本例之介紹發動機和輪胎的製造
現在要生產兩種車輛:寶馬和奔馳,寶馬和奔馳的發動機和輪胎都有各自的要求,所以提取抽象,即發動機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();
}
}
}
抽象工廠模式的優點:
良好的封裝,客戶端不需要關心具體的實現類,客戶端只需要關注接口即可
抽象工廠模式的缺點:
不易擴展新產品,例如上面汽車製造的例子,如果現在增加一個車門的製造,那麼我們需要定義一個車門的抽象類,定義寶馬和奔馳的車門實現類,增加車門的抽象工廠類,定義寶馬和奔馳車門生產的工廠類,如果不止這兩種車呢?想想吧,我們需要寫多少類