前面我們介紹了簡單工廠模式,今天我們來看一下工廠模式。 工廠模式的定義為:定義一個用於創建對象的介面,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類。 我們看以下例子。首先是產品類,用來定義共產所生產的部分產品,這部分代碼和簡單工廠模式的代碼相同。 接下來是和簡單工廠不同的地方,首先我 ...
前面我們介紹了簡單工廠模式,今天我們來看一下工廠模式。
工廠模式的定義為:定義一個用於創建對象的介面,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類。
我們看以下例子。首先是產品類,用來定義共產所生產的部分產品,這部分代碼和簡單工廠模式的代碼相同。
//產品介面
public interface Product { void run(); } //具體產品 public class Bicycle implements Product { @Override public void run() { System.out.println("ride on a bicycle"); } } public class Car implements Product { @Override public void run() { System.out.println("drive car"); } }
接下來是和簡單工廠不同的地方,首先我們先回憶一下之前簡單工廠的工廠類
//簡單工廠的工廠類
public class Factory { public static void createProduct(String productName){ Product product = null; switch (productName){ case "car": product = new Car(); break; case "bicycle" : product = new Bicycle(); break; } product.run(); } }
接下來我們看一下工廠模式下的工廠類,這裡把工廠區分為了各個產品的工廠,抽取出一個工廠介面,在每個具體的工廠中創建產品類的實例。
//工廠介面
public interface IFactory {
//創建產品 Product createProduct(); }
//具體工廠
public class CarFactory implements IFactory { @Override public Product createProduct() {
//創建產品實例對象 return new Car(); } } public class BicycleFactory implements IFactory { @Override public Product createProduct() { return new Bicycle(); } }
最後我們看一下簡單工廠模式和工廠模式客戶端實現的區別
//簡單工廠模式下客戶端
public class Customer { public static void main(String[] args) { Factory.createProduct("car"); Factory.createProduct("bicycle"); } }
//工廠模式下的客戶端 把簡單工廠模式下的工廠類中判斷創建產品實例的邏輯移動到了客戶端中,由客戶端來判斷
public class Customer { public static void main(String[] args) { IFactory carFactory = new CarFactory(); Product car = carFactory.createProduct(); car.run(); IFactory bicycleFactory = new BicycleFactory(); Product bicycle = bicycleFactory.createProduct(); bicycle.run(); } }
我們可以看到簡單工廠模式中,客戶端只需要把自己的需求中告訴工廠,工廠可以自己去判斷生產哪一個產品,這種模式的優點就是去除了客戶端與產品的依賴,但是每次我們增加新產品時都要去修改工廠類,這樣就有可能對其他產品產生影響,違反了開放-封閉原則,而且工廠和產品分支耦合,根據依賴倒轉原則,才有了後來的工廠方法。正如上文工廠模式定義的那樣,我們創建了一個IFactory介面,然後定義了多個具體產品工廠類實現這個介面,在具體產品工廠類中生產產品(創建產品實例),這樣每次我們新增產品時,就不用去改原來的工廠方法,只需要添加新的工廠就可以了。