1. 程式人生 > >設計模式之 - 簡單工廠模式

設計模式之 - 簡單工廠模式

一、什麼是簡單工廠模式

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,一個抽象的產品類,可以派生出多個具體的產品類,它們都具有共同的父類。

我們再來看下簡單工廠模式的UML圖:

二、簡單工廠模式的構成

  • 工廠類:工廠類是我們的核心類,它負責建立所有例項的內部邏輯,工廠類可以直接被呼叫建立我們的產品例項。

  • 抽象產品類:簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所擁有的公共介面。

  • 具體產品類:簡單工廠所建立的具體的例項物件。

三、例項演示

我們做這個一個分析,有一家造車廠它裡面可以造車的各個零件,在這個廠裡,有專門造輪胎的車間,有專門造發動機的車間還有換門造車玻璃的車間,那麼我們想一下,這些車間是不是都是歸屬於這個造車廠的,每個車間是不是都有自己的職能。

假設我們現在組裝車間要組裝一輛車,他們需要發動機、輪胎、玻璃等部件,那麼作為組裝車的人,他們根本不關心你怎麼做,他們只關心這個東西做沒做好,做好了趕緊遞過來,我這邊要用。

我們先來建立一個造車廠的類:

public interface CarFactory {

   void ability();
}

我們既然有了造車廠,那麼我們地下的車間部門只需要實現這個類,去完成各自的職能就可以了

玻璃車間:

public class Glass implements CarFactory{

   @Override
   public void ability() {

       System.out.println("玻璃已經生產好了");
   }
}

發動機車間:

public class Engine implements CarFactory {

   @Override
   public void ability() {

       System.out.println("發動機製造好了");
   }
}

輪胎車間:

public class AutoTyre implements CarFactory{

   @Override
   public void ability() {

       System.out.println("輪胎已經生產好了");
   }
}

既然已經有個產品類和具體的產品,那麼接下來我們是不是要做一個工廠去進行生產啊,工廠類是整個模式的關鍵,它需要進行必要的邏輯判斷,根據消費者給的資訊,它需要決定來建立哪個物件的例項,消費者不再關心如何建立具體的產品,他只需要負責好需要生產的產品就行了。

public class Product {

   public static CarFactory product(String skill) {

       CarFactory carFactory = null;

       switch (skill) {
           // 製造輪胎
           case "autoTyre":
               carFactory = new AutoTyre();
               break;
           // 製造發動機
           case "engine":
               carFactory = new Engine();
               break;
           // 製造玻璃
           case "glass":
               carFactory = new Glass();
       }

       return carFactory;
   }
}

在這裡我們可以發現,所有類都有一個共同的父類,到這裡大家應該可以發現,我們平時所說的封裝、繼承、多型在這裡是不是已經體現出來了(這裡面我沒用繼承,是因為Java是單繼承的,所以我這裡改為了介面實現的方式,因為Java是可以多實現的,這樣有利於我們程式的擴充套件)。

接下里,我們來看下組裝車間是怎麼來索要所需的部件的

public class CarMain {

   public static void main(String[] args) {

       // 生產一個發動機
       CarFactory engine = Product.product("engine");
       engine.ability();

       // 生產一個玻璃
       CarFactory glass = Product.product("glass");
       glass.ability();

       // 生產一個輪胎
       CarFactory autoTyre = Product.product("autoTyre");
       autoTyre.ability();
   }
}

我們先來看下結果:

如果我們想要再去生產其他的一些部件,我們只需要去實現造車廠的類,完成自己特定的職能就可以了,也不會去跟其他的車間有任何的交集,我們只需要完成我們的需要做的東西就好。

四、模式優點

  • 首先程式實現瞭解耦和,大大降低的程式之間的耦合性,我們增加車間不會影響到其他的車間進度;

  • 提高了程式的擴充套件性,如果我們想要增加一個車間,那麼只需要實現造車廠類,完成自己的職能就好;

  • 組裝車間可以免除直接建立物件的責任,他不需要自己直接去建立,而是通過我們專門的工廠類來建立,他只需要告訴我們他需要什麼東西;

五、簡單工廠模式的缺點

  • 首先大家應該可以明顯的發現,如果我們每增加一個產品,那相應的我們就要增加一個子工廠,這樣額外的加大了我們的開發量;

  • 由於工廠類集中了所有例項的建立邏輯,違反了高類聚責任分配原則;

六、使用場景

  • 工廠類建立的物件比較少;

  • 消費者只需要傳進工廠類的引數,對於如何建立物件不關心;