1. 程式人生 > >【java】Factory工廠模式的應用

【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!

可見,兩個工廠分別生產了不同的汽車、摩托車和自行車產品,當然,也可以生產部分一樣的產品。

抽象工廠方法相比於其他方法更加易於擴充套件,並且具有更大的靈活性。但是,缺點就是類數量可能會過於龐大。