創(chuàng)建型模式之工廠方法模式

一、定義

工廠方法模式:將對(duì)象的創(chuàng)建封裝到工廠中去實(shí)現(xiàn)。
說(shuō)道工廠方法模式我們一定會(huì)想到和它相關(guān)聯(lián)的簡(jiǎn)單工廠模式和抽象工廠模式,簡(jiǎn)單工廠模式非常簡(jiǎn)單,這里我們不作討論,抽象工廠模式下節(jié)討論。

二、應(yīng)用場(chǎng)景

當(dāng)我們要?jiǎng)?chuàng)建的對(duì)象種類不確定時(shí),后期有可能改變時(shí),工廠方法模式比較適合。
比如:現(xiàn)在很多app都有消息中心,消息中心里包括很多消息類型,而每種消息類型的樣式又不一樣,并且隨著版本的迭代還會(huì)增加很多消息類型,這時(shí)候用工廠方法模式就再合適不過(guò)了。

三、類圖

工廠方法模式類圖.png

四、模式的簡(jiǎn)單實(shí)現(xiàn)

其實(shí)工廠方法模式相對(duì)來(lái)說(shuō)也比較簡(jiǎn)單,接下來(lái)我們還是以賣果汁的小店為例來(lái)演示一下工廠方法。
我們知道果汁店不止一種果汁,根據(jù)多態(tài),我們將果汁抽象化。

public interface IJuice {
  void make();
}

接下來(lái)我們實(shí)現(xiàn)幾個(gè)具體的產(chǎn)品,假設(shè)有蘋果汁、芒果汁、草莓汁。

public class AppleJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make apple juice");
  }
}

public class MangoJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make mango juice");
  }
}

public class StrawberryJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make strawberry juice");
  }
}

接下來(lái)是工廠類:

public class JuiceFactory {
  public IJuice static makeJuice(String name){
    if("apple".equals(name)){
      return new AppleJuice();
    }else if("mango".equals(name)){
      return new MangoJuice();
    }else if("strawberry".equals(name)){
      return new StrawberryJuice();
    }
    return null;
  }
}

接下來(lái)是場(chǎng)景類:

public class Client {
  public static void main(String[] args) {
    IJuice juice = JuiceFactory.makeJuice("apple");
    juice.make();
  }
}

根據(jù)點(diǎn)的果汁名字去制作相應(yīng)的果汁,這時(shí)如果果汁店又加了兩種果汁,葡萄汁和西瓜汁,我們還要去修改相應(yīng)的JuiceFactory類里的邏輯,這會(huì)造成維護(hù)的成本太大,根據(jù)開閉原則,即對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,我們修改下工廠類,實(shí)現(xiàn)具體工廠生產(chǎn)具體產(chǎn)品。
抽象工廠:

public interface IJuiceFactory {
  IJuice makeJuice();
}

具體工廠:

public class AppleJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new AppleJuice();
  }
}

public class MangoJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new MangoJuice();
  }
}

public class StrawberryJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new StrawberryJuice();
  }
}

場(chǎng)景類:

public class Client {
  public static void main(String[] args) {
    IJuiceFactory juiceFactory = new AppleJuiceFactory();
    IJuice juice = juiceFactory.makeJuice();
    juice.make();
  }
}

假如這時(shí)我們?cè)黾恿似咸阎覀冎恍枰黾右粋€(gè)具體工廠類和具體產(chǎn)品類即可,其他什么都不用改,這樣我們維護(hù)起來(lái)就比較easy。

public class GrapeJuice implements IJuice{

  @Override
  public void make() {
    System.out.println("make grape juice");
  }
}

public class GrapeJuiceFactory implements IJuiceFactory{

  @Override
  public IJuice makeJuice() {
    return new GrapeJuice();
  }
}

五、總結(jié)

工廠方法模式就是將對(duì)象的創(chuàng)建放到具體的工廠類中去實(shí)現(xiàn),因此對(duì)于多種種類的產(chǎn)品時(shí),可以使用工廠方法模式進(jìn)行解耦。
優(yōu)點(diǎn):擴(kuò)展性比較好,當(dāng)有新的產(chǎn)品產(chǎn)生時(shí),不用修改現(xiàn)有的邏輯,只需要增加一個(gè)產(chǎn)品類和工廠類即可。降低了代碼之間的耦合度,修改一種產(chǎn)品時(shí)并不會(huì)影響其他產(chǎn)品。
缺點(diǎn):當(dāng)產(chǎn)品種類較多時(shí),會(huì)導(dǎo)致類過(guò)多,增加類定義的內(nèi)存開銷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容