1.概念:
回顧第一篇中簡單工廠模式,當我們需要增加一個計算乘方的類時,我們需要增加乘方類實現Arithmetic
,同時修改工廠類ArithmeticFactory
,這樣就違背了"對修改關閉,對擴展開放"的原則,在此我們引入工廠模式。
工廠模式:每個要創建的類都對應一個工廠類,所有具體的工廠類都實現自統一的工廠類,當需要擴展對象時,則增加新對象工廠類即可。
2.案例
本案例以汽車工廠生產汽車爲例,有兩個汽車工廠"寶馬工廠"和"寶駿工廠",我們根據需求選擇汽車工廠,從而實現寶馬工廠生產寶馬汽車,寶駿工廠生產寶駿汽車。
- 創建統一的工廠類
public interface CarFactory {
Car createCar();
}
- 創建寶馬工廠類
public class BMWFactory implements CarFactory {
@Override
public Car createCar() {
System.out.println("生成寶馬汽車");
return new BMWCar();
}
}
- 創建寶駿工廠類
public class BJFactory implements CarFactory {
@Override
public Car createCar() {
System.out.println("生產寶駿汽車");
return new BJCar();
}
}
- 創建汽車類及具體的品牌汽車類
public class BMWCar implements Car {
@Override
public String getBrand(){
return "寶馬汽車";
}
}
--------------------------------------------------------------------------
public class BJCar implements Car {
@Override
public String getBrand() {
return "寶駿汽車";
}
}
--------------------------------------------------------------------------
public interface Car {
String getBrand();
}
- 測試
public class MainTest {
public static void main(String[] args) {
BMWFactory bmwFactory = new BMWFactory();
Car car = bmwFactory.createCar();
System.out.println(car.getBrand());
BJFactory bjFactory = new BJFactory();
Car car1 = bjFactory.createCar();
System.out.println(car1.getBrand());
}
}
- 擴展
當我們需要創建寶沃汽車時,我們只需要創建一個寶沃工廠實現總工廠,然後通過寶沃工廠生產寶沃汽車。
public class BWFactory implements CarFactory {
@Override
public Car createCar() {
System.out.println("生產寶沃汽車");
return new BWCar();
}
}
--------------------------------------------------------------------------
public class BWCar implements Car {
@Override
public String getBrand() {
return "寶沃汽車";
}
}
--------------------------------------------------------------------------
BWFactory bwFactory = new BWFactory();
Car car2 = bwFactory.createCar();
System.out.println(car2.getBrand());
-
總結
通過工廠模式創建對象,不需要在對原有工廠類進行修改,遵循了"對修改關閉,對擴展開放"的原則,但每需要擴展一個類時,都需要增加一個具體工廠,從而增加的開發和代碼的複雜度
-
案例結構