DesignPattern - Basic - Factory

Tue, Aug 7, 2018 閱讀時間 2 分鐘

Factory

一個具有多個子類的父類別並且基於輸入,我們需要返回其中一個子類時,使用工廠設計模式。這種模式將類從客戶端程序實例化到工廠類的責任。 工廠模式中的超類可以是 interface,也可以是 abstract class,也可以是普通的 Java class。


    public interface ICellPhone {
        public void open();
        public void close();
        public void call();
    }

    public class ApplePhone implements ICellPhone {

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

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

      @Override
      public void call() {
         System.out.println("apple phone call David");
      }
    }

    public class SamsungPhone implements ICellPhone {

      @Override
      public void open() {
        // ...
      }

      @Override
      public void close() {
        // ...
      }

      @Override
      public void call() {
        // ...
      }
    }

Factory


public class CellPhoneFactory {

      public CellPhoneFactory(){

      }

      ICellPhone createCellPhone(String type){
         ICellPhone cellPhone = null;
         if("apple".equalsIgnoreCase(type)){
            cellPhone = new ApplePhone();
            System.out.println("apple cell phone created");
         }else if("samsung".equalsIgnoreCase(type)){
            cellPhone = new SamsungPhone();
            System.out.println("three start cell phone created");
         }
         return cellPhone;
      }

    }

      public static void main(String[] args) {

         var factory = new CellPhoneFactory();
         ApplePhone apple = (ApplePhone)factory.createCellPhone("apple");
         len.open();

         SamsungPhone threeStarts = (SamsungPhone)factory.createCellPhone("samsung");
         sam.close();
      }

小節

  • 工廠模式為接口而不是實現提供了一種代碼方法。
  • 工廠模式從客戶端代碼中刪除了實際實現類的實例化,使其更健壯、耦合更少且易於擴展。例如,我們可以很容易地更改類的實現,因為客戶端不知道它。
  • 工廠模式還通過繼承在實現類和客戶端類之間提供抽象。

Abstract Factory

幾乎類似於 工廠模式,除了它更像工廠的工廠。 一個 Factory 類,它根據提供的輸入返回不同的子類。通常,工廠類使用 if-else 或 switch-case 語句來實現這一點。 但是,在抽象工廠模式中,擺脫了 if-else 塊,並為每個子類創建了一個工廠類,然後是一個抽象工廠類,該類將根據輸入工廠類返回子類。

實際上,抽象工廠就是返回工廠的工廠。為什麼這個抽象層有用?普通工廠可用於創建相關對象集。抽象工廠返回工廠。因此,抽象工廠用於返回可用於創建相關對象集的工廠。


    public interface ICellPhoneFactory {

        ICellPhoneFactory createPhone(String type);
    }


    // 抽象工廠 => 生產工廠
    public class CellPhoneFactory implements ICellPhoneFactory {

        @Override  
        ICellPhoneFactory createPhone(String type){
            ICellPhoneFactory cellPhoneFactory = null;
            if("apple".equalsIgnoreCase(type)){
                cellPhoneFactory = new AppleCellPhoneFactory();
                System.out.println("apple factory created");
            }else if("samsung".equalsIgnoreCase(type)){
                cellPhoneFactory = new AppleCellPhoneFactory();
                System.out.println("three start factory created");
            }
            return cellPhone;
        }
    }

    public class AppleCellPhoneFactory extends CellPhoneFactory {

        AppleCellPhone createApplePhone(){
            return new AppleCellPhone();
        }
    }

    public class AbstractFactoryTest {

        public static void main(String[] args) {
            CellPhoneFactory factory = new CellPhoneFactory();
            AppleCellPhoneFactory apple = (AppleCellPhoneFactory)factory.createPhone("apple");
            AppleCellPhone apple = (AppleCellPhone)apple.createApplePhone();
            apple.call();
        }
    }
  • 抽象工廠模式還提供了一種為接口而不是實現編寫代碼的方法。
  • 工廠模式是 “工廠中的工廠”,可以輕鬆擴展以容納更多產品。例如,可以添加另一個子類 “HTC” 和工廠 “TwCellPhoneFactory”。
  • 抽象工廠模式是強大的,它消除了與工廠模式不同的條件邏輯。