1. 程式人生 > >工廠模式(3)方法工廠模式

工廠模式(3)方法工廠模式

 

     前言經過前篇文章的學習,大家應該形成一種潛意識,那就是不管什麼設計模式,它的核心目的是為了解決開發中遇到的問題。完美的解決問題則需要遵循一些原則,比如開閉原則、單一原則、里氏替換原則、依賴倒轉原則、

 

口隔離原則、迪米特法則和合成用原則,一句話設計模式為了程式的擴充套件性好,易於維護和升級。

 

 

 

     開發就像打仗一樣,如果雙方實力一樣最開始會硬鋼,但是如果一邊人少還想贏得戰爭只能想套路了,於是就有了《孫子兵法》《三十六計》,書裡面告訴了我們應該用什麼計謀應對特定的情況,比如《三十六計》就有勝戰計、

 

敵戰計、攻戰計、混戰計、並戰計、敗戰計,其實更多的時候是多種計謀一起使用,比如王允使用美人計+連環計巧殺董卓。學習更多設計模式之後你還會面臨設計模式選擇的問題,比如金蟬脫殼和走為上策有什麼區別,關於這些就屬於

 

設計模式高深的內容了,請持續關注我們設計模式後續的內容。

 

 

 

                                           

 

 

 

 

問題描述上次小張使用簡單工廠模式完美的解決了埃及貓與波斯貓的建立問題,而且小張感覺自己的程式碼是可以完美擴充套件的.

 

 

public class TestEasyFactory {

public static void main(String[] args) {

//向工廠模式傳參並建立物件

Cat cat = CatFactory.create(CatType.PersianCat);

}

 

class CatFactory {

public static Cat create(CatType type) {

Cat cat = null;

//判斷貓的型別建立物件

if (CatType.PersianCat == type) {

cat = new PersianCat();

} else if (CatType.Egypt == type) {

cat = new EgyptCat();

}

return cat;

}

}

 

interface Cat {

 

}

 

class EgyptCat implements Cat {

public void run() {

System.out.println("EgyptCat.run()");

}

}

 

class PersianCat implements Cat {

public void run() {

System.out.println("PersianCat.run()");

}

}

 

enum CatType {

PersianCat, Egypt

}

 

 

   但是隨著越來越多貓的型別加入,小張發現自己的工廠判斷程式碼要不斷的更新判斷邏輯,其實這暴露出兩個問題:

 

          1、我們開發過的程式碼不應該被大量修改,如果三個程式設計師同時修改一個檔案難免出現不熟悉人的業務而出現錯誤

 

          2、如果產品太多不應該讓一個工廠處理所有的建立,這會這個工廠類變的臃腫而增加控制成本

 

   比如你不能依靠一個工廠建立賓士的跑車和商務車,而應該多個工廠各司其職。小張意識到這個問題之後於是將程式碼修改如下

 

 

 

public class TestMethodFactory {

public static void main(String[] args) {

// 向工廠模式傳參並建立物件

CatFactory factory = new EgyptCatFactory();

// 建立貓物件

Cat cat = factory.create();

}

}

 

interface Cat {

 

}

 

interface CatFactory {

public Cat create();

}

 

class EgyptCat implements Cat {

public void run() {

System.out.println("EgyptCat.run()");

}

}

 

class EgyptCatFactory implements CatFactory {

@Override

public Cat create() {

return new EgyptCat();

}

}

 

class PersianCat implements Cat {

public void run() {

System.out.println("PersianCat.run()");

}

}

 

class PersianCatFactory implements CatFactory {

@Override

public Cat create() {

return new PersianCat();

}

}

 

 

    通過對上述程式碼的觀察,我們大概可以發現兩件事情:

 

          1、核心工廠類不會被別人修改,以後無論增加什麼子類,只需要建立子類並建立子類的工廠類即可

 

                                 2、以後每個物件建立都會由自己的工廠類實現,即使建立過程再複雜不會對別人的程式碼產生干擾,而且分工明確,擴充套件性極好

 

    以上兩點就是方法工廠模式的核心思想

 

 

              

 

 

      天要下雨需求要變是阻攔不了的,現在寵物醫院規模變大,增加了小狗類和小貓類,而且還分為觀賞型和運動型寵物,將來有可能還會把老鼠加進來,那麼你感覺這會給小張的開發帶來什麼難點?

 

      請繼續關注我們後續的文章《工廠模式(4抽象工廠模式