【java】Factory工廠模式的應用
一、簡介
工廠模式(factory)是設計模式的一種,它類比了工廠中的生產方式:對外只提供產品的選擇,整個產品的生成由內部完成。
工廠模式由工廠方法和抽象工廠兩種實現方式。
工廠模式簡單來說,就是使用一個工廠類來代替new關鍵字,完成對各種物件的例項化。這樣做的好處,就是可以避免重複使用new關鍵字。在實際程式設計過程中,對於人來說,重複的簡單工作容易出現錯誤,而機器不會,這也是工廠模式的最大意義之一。
二、工廠方法(factory method)
首先,我們需要的是產品,假設產品共有三種,分別為car、motorbike和bike。
建立一個Product介面:
publicinterfaceProduct { publicabstractvoid report();//輸出產品生產成功的訊息 }
隨後是三種具體產品的實現:
Car.java
publicclassCar implementsProduct{
@Override
publicvoid report() {
System.out.println("A car was created!");
}
}
Motorbike.java
publicclassMotorbike implementsProduct{ @Override publicvoid report() { System.out.println("A motorbike was created!"); } }
Bike.java
publicclassBike implementsProduct{
@Override
publicvoid report() {
System.out.println("A bike was created!");
}
}
有了三種產品之後,就可以建立工廠類了。
1.簡單工廠
簡單工廠是工廠方法的一種,使用簡單的判斷條件來判斷需要生產哪種產品。
建立工廠類如下:
publicclassSimpleFactory { public Product produce(intindex) { if (index == 0) { returnnew Car(); }elseif(index== 1) { returnnew Motorbike(); }elseif(index== 2) { returnnew Bike(); }else{ returnnull;//異常處理 } } }
在具體使用時:
publicclassMain {
publicstaticvoid main(String[] args) {
SimpleFactorySimpleFactory= newSimpleFactory();
Productproduct1= SimpleFactory.produce(0);//生產汽車
Productproduct2= SimpleFactory.produce(1);//生產摩托車
Productproduct3= SimpleFactory.produce(2);//生產自行車
//報告生產資訊
product1.report();
product2.report();
product3.report();
}
}
輸出資訊為:
A car was created!
A motorbike was created!
A bike was created!
該方法的思路比較簡單,只需要記住產品對應的序號即可,但是每當需要增加一種產品的時候,就必須要更改工廠類中的判斷條件。
2.工廠方法(多產品工廠)
工廠類也可以不是依靠接收特定標識而生產產品,而是直接使用不同的方法來生產不同的產品。
建立工廠類如下:
publicclassFactoryMethod {
public Product createCar() {
returnnew Car();//生產汽車
}
public ProductcreateMotorbike() {
returnnew Motorbike();//生產摩托車
}
public Product createBike() {
returnnew Bike();//生產自行車
}
}
在使用時:
FactoryMethod FactoryMethod = new FactoryMethod();
Product product4 = FactoryMethod.createCar();//生產汽車
Product product5 = FactoryMethod.createMotorbike();//生產摩托車
Product product6 = FactoryMethod.createBike();//生產自行車
//報告生產資訊
product4.report();
product5.report();
product6.report();
輸出資訊為:
A car was created!
A motorbike was created!
A bike was created!
該方法相比於簡單工廠,更加易於使用,因為採用不同的方式建立不同產品對於使用者來說更加容易理解。但是,簡單工廠的缺點也仍然存在。
三、抽象工廠
通過將工廠類抽象化,就能夠實現多個工廠,並且各個工廠之間可以有一個或多個產品。按照具體工廠類的產品數量,抽象工廠方法還能夠細分,但是這裡不再劃分。
首先,建立一個抽象工廠類:
publicabstractclassAbstractFactory {
publicabstract ProductcreateCar();
publicabstract ProductcreateMotorbike();
publicabstract ProductcreateBike();
}
它的具體實現類可以是多個不同的工廠,這些工廠同樣能夠生產出汽車、摩托車、自行車,但是具體的產品可以不同。
接下來,我們需要更多的產品:
Car2.java
publicclassCar2 implementsProduct{
@Override
publicvoid report() {
System.out.println("A car2 was created!");
}
}
Motorbike2.java
publicclassMotorbike2 implementsProduct{
@Override
publicvoid report() {
System.out.println("A motorbike2 was created!");
}
}
Bike2.java
publicclassBike2 implementsProduct{
@Override
publicvoid report() {
System.out.println("A bike2 was created!");
}
}
為了方便,我們直接將前面例子中的FactoryMethod作為工廠之一:
publicclassFactoryMethod extends AbstractFactory{
public Product createCar() {
returnnew Car();
}
public Product createMotorbike() {
returnnew Motorbike();
}
public Product createBike() {
returnnew Bike();
}
}
隨後,再建立一個新的工廠:
publicclassFactoryMethod2 extends AbstractFactory{
public Product createCar() {
returnnew Car2();
}
public ProductcreateMotorbike() {
returnnew Motorbike2();
}
public Product createBike() {
returnnew Bike2();
}
}
實際使用時:
AbstractFactory FactoryMethod = new FactoryMethod();
AbstractFactory FactoryMethod2 = new FactoryMethod2();
Product product4 = FactoryMethod.createCar();//生產汽車
Product product5 = FactoryMethod.createMotorbike();//生產摩托車
Product product6 = FactoryMethod.createBike();//生產自行車
Product product7 = FactoryMethod2.createCar();//生產另一種汽車
Product product8 = FactoryMethod2.createMotorbike();//生產另一種摩托車
Product product9= FactoryMethod2.createBike();//生產另一種自行車
//報告生產資訊
product4.report();
product5.report();
product6.report();
product7.report();
product8.report();
product9.report();
輸出資訊為:
A car was created!
A motorbike was created!
A bike was created!
A car2 was created!
A motorbike2 was created!
A bike2 was created!
可見,兩個工廠分別生產了不同的汽車、摩托車和自行車產品,當然,也可以生產部分一樣的產品。
抽象工廠方法相比於其他方法更加易於擴充套件,並且具有更大的靈活性。但是,缺點就是類數量可能會過於龐大。