簡單工廠模式
定義
通過一個Factory類獲取在這個類下被定義的所有類,獲取的類使用者無法看到如何實例化出來的
生活中舉例:
客:我要買寶馬!!!
商家:您買哪款???
客:我買寶馬7系!!!
圖解(UML圖網上一大堆這裏就放個我自己畫的)
java代碼
接口
/**
* 汽車類
* 工廠模式頂層接口
* 生活中類似於 這款車的品牌是寶馬
* @author xiaokun
*/
public interface ICar {
}
枚舉類
/**
* 汽車型號枚舉
* 例如生活中 寶馬6,7,8系
* @author xiaokun
*/
public enum CarType {
BMW6,
BMW7,
BMW8
}
實現類(工廠中的產品)
/**
* BWM6
* 寶馬車的具體類型
* @author xiaokun
*/
public class BMW6 implements ICar{
public BMW6() {
System.out.println("我選擇了寶馬6系");
}
}
/**
* BWM7
* 寶馬車的具體類型
* @author xiaokun
*/
public class BMW7 implements ICar{
public BMW7() {
System.out.println("我選擇了寶馬7系");
}
}
/**
* BWM8
* 寶馬車的具體類型
* @author xiaokun
*/
public class BMW8 implements ICar{
public BMW8() {
System.out.println("我選擇了寶馬8系");
}
}
工廠類(列舉了2種內部方式)
/**
* 商家
* 寶馬汽車工廠類
* @author xiaokun
*/
public class BMWCarFactoryBuilder {
public static ICar BMWCarFactory(CarType ct) {
/*========================================
* 這是通過枚舉方式獲取所需要的對象
switch (ct) {
case BMW6: return new BMW6();
case BMW7: return new BMW7();
case BMW8: return new BMW8();
default: return null;
}
===============================================*/
//這裏可以通過配置文件達到鬆耦合的獲取對象,這裏使用枚舉模擬配置文件
ICar car;
try {
car = (ICar) Class.forName("Factory.impl."+ct.name()).getConstructor().newInstance();
} catch (Exception e) {
return null;
}
return car;
}
}
測試類
/**
* 簡單工廠測試類
* @author xiaokun
*/
public class Test {
public static void main(String[] args) throws Exception {
//遍歷枚舉檢查工廠類的情況
for(CarType ct : CarType.values())
BMWCarFactoryBuilder.BMWCarFactory(ct);
}
}
測試結果
我選擇了寶馬6系
我選擇了寶馬7系
我選擇了寶馬8系