簡單工廠:
又稱爲靜態工廠方法模式,
組成 :
(1) 工廠類角色 : 本模式核心, 含有一定的商業邏輯和判斷邏輯, 用於創建產品 .
(2) 抽象產品角色 : 一般是具體產品繼承的父類或者實現的接口 .
(3) 具體產品角色 : 工廠類所創建的對象就是此角色的實例, 在java中由一個具體類實現 .
缺點 : 當增加一種產品, 都需要在工廠類中增加相應的創建業務邏輯 , 這顯然違背了開閉原則 .
- 產品類
public class Car {
}
public class Audi extends Car {
}
public class Bmw extends Car {
}
- 工廠類
public class SimpleFactory {
public static Car createCar(String carType) {
if(carType.equals("Audi")) {
return createAudi();
} else if (carType.equals("Bmw")) {
return createBmw();
}
return null;
}
public static Bmw createBmw() {
return new Bmw();
}
public static Audi createAudi() {
return new Audi();
}
}
工廠方法:
工廠方法模式去掉了簡單工廠方法的靜態屬性,使得可以被子類繼承, 這樣在簡單工廠模式裏幾種在工廠方法上的壓力可以由工廠方法模式裏的不同的工廠子類來分擔 .
(1) 抽象工廠角色 : 工廠方法的核心, 和應用程序無關, 是具體工廠角色必須實現的接口或者必須繼承的父類, 在java中用抽象類或者接口實現 .
(2) 具體工廠角色 : 它含有和具體業務相關的代碼, 由應用程序調用以創建對應的具體產品對象 .
(3) 抽象產品角色 : 它是具體產品繼承的父類或者實現的接口.
(4) 具體產品角色 : 具體工廠角色所創建的對象就是此角色實例 .
工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠中的”上帝類” , 這樣分擔了對象承受的壓力, 而且這種使得結構變得靈活起來–當有新產品生產時, 只要按照抽象產品角色, 抽象工廠角色提供合同完成, 就可以被客戶使用, 而不需要修改現有代碼, 工廠方法的結構符合開閉原則 .
- 產品類
public abstract class Bmw {
}
public class Bmw320 extends Bmw {
public Bmw320() {
System.out.println("生產bmw320");
}
}
public class Bmw523 extends Bmw {
public Bmw523() {
System.out.println("生產bmw523");
}
}
- 工廠類
public abstract class FactoryBmw {
public abstract Bmw createBmw();
}
public class FactoryBmw523 extends FactoryBmw {
@Override
public Bmw createBmw() {
return new Bmw523();
}
}
public class FactoryBmw320 extends FactoryBmw {
@Override
public Bmw createBmw() {
return new Bmw320();
}
}
- 客戶端
public class Client {
public static void main(String[] args) {
FactoryBmw factory1 = new FactoryBmw320();
factory1.createBmw();
FactoryBmw factory2 = new FactoryBmw523();
factory2.createBmw();
}
}
抽象工廠:
當每一個抽象產品都有多於一個的具體子類的時候(空調有A和B型號, 發動機有A和B型號) , 工廠角色怎麼知道實例化哪一個子類呢? 比如每個抽象角色產品都有兩個具體角色(產品空調有兩個具體產品空調A和空調B) , 抽象工廠模式提供兩個具體工廠角色(寶馬320系列工廠和寶馬230系列工廠) , 分別對應於兩個具體產品角色, 每一個具體工廠角色只負責某一個產品角色的實例化, 每一個具體工廠只負責創建抽象產品的某一個具體的子類的實例 .
- 產品類
public interface Engine {
}
public class EngineA implements Engine {
public EngineA() {
System.out.println("製造engine--->A");
}
}
public class EngineB implements Engine {
public EngineB() {
System.out.println("製造engine--->B");
}
}
public interface Aircondition {
}
public class AirconditionA implements Aircondition {
public AirconditionA() {
System.out.println("生產airCondition--->A");
}
}
public class AirconditionB implements Aircondition {
public AirconditionB() {
System.out.println("生產Aircondition--->B");
}
}
- 工廠類
public abstract class AbstractFactory {
public abstract Engine createEngine();
public abstract Aircondition createAircondition();
}
public class FactoryBMW523 extends AbstractFactory{
@Override
public Engine createEngine() {
return new EngineB();
}
@Override
public Aircondition createAircondition() {
return new AirconditionB();
}
}
public class FactoryBMW320 extends AbstractFactory {
@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public Aircondition createAircondition() {
return new AirconditionA();
}
}
- 客戶端
public class Client {
public static void main(String[] args) {
AbstractFactory factoryA = new FactoryBMW320();
factoryA.createEngine();
factoryA.createAircondition();
AbstractFactory factoryB = new FactoryBMW523();
factoryB.createEngine();
factoryB.createAircondition();
}
}
總結 :
(1)簡單工廠模式是由一個具體的類去創建其他類的實例,父類是相同的,父類是具體的。
(2)工廠方法模式是有一個抽象的父類定義公共接口,子類負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成。
(3)抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定他們具體的類。它針對的是有多個產品的等級結構。而工廠方法模式針對的是一個產品的等級結構。