前面咱們介紹了簡單工廠模式,今天咱們來看一下工廠模式。ide
工廠模式的定義爲:定義一個用於建立對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到子類。spa
咱們看如下例子。首先是產品類,用來定義共產所生產的部分產品,這部分代碼和簡單工廠模式的代碼相同。code
//產品接口
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(); } }
接下來咱們看一下工廠模式下的工廠類,這裏把工廠區分爲了各個產品的工廠,抽取出一個工廠接口,在每一個具體的工廠中建立產品類的實例。blog
//工廠接口
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接口,而後定義了多個具體產品工廠類實現這個接口,在具體產品工廠類中生產產品(建立產品實例),這樣每次咱們新增產品時,就不用去改原來的工廠方法,只須要添加新的工廠就能夠了。產品