1.2_工廠方法模式

角色組成
1.抽象工廠角色:這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
2.具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。在java中它由具體的類來實現。
3.抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
4.具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
水果:抽象產品
package co.xiaowenzi.study;
public interface Fruit {
   // 送給客戶
   void send();
}
 
package co.xiaowenzi.study;
public class Apple implements Fruit {
   @Override
   public void send() {
      System.out.println("蘋果已經種好,送給客戶");
   }
}
 
package co.xiaowenzi.study;
public class Banana implements Fruit {
   @Override
   public void send() {
      System.out.println("香蕉已經種好,送給客戶");
   }
}
 
果農: 抽象工廠
package co.xiaowenzi.study;
public interface Farmer {
   public Fruit PlantTree();
}
 
package co.xiaowenzi.study;
public class AppleFarmer implements Farmer {
   @Override
   public Fruit PlantTree() {
      System.out.println("蘋果果農種植完成");
      return new Apple();
   }
}
 
package co.xiaowenzi.study;
public class BananaFarmer implements Farmer{
   @Override
   public Fruit PlantTree() {
      System.out.println("香蕉果農種植完成");
      return new Banana();
   }
}
 
製造工廠: 具體工廠和產品
package co.xiaowenzi.study;
public class FruitFactory {
   /**
    * 水果工廠,等待客戶下單進行生產
    * @param which
    * @return
    * @throws Exception
    */
   public static Fruit factory(String which) {
      // 利用反射來知道那種水果,找到對應的果農種植
      Farmer farmer = null;
      Fruit fruit = null;
      try {
         farmer = (Farmer) Class.forName("co.xiaowenzi.study." + which + "Farmer").newInstance();
         if (farmer!=null) {
            fruit = farmer.PlantTree();
         }
      } catch (InstantiationException e) {
         //e.printStackTrace();
      } catch (IllegalAccessException e) {
         //e.printStackTrace();
      } catch (ClassNotFoundException e) {
         //e.printStackTrace();
      }
      return fruit;
   }
}
 
客戶
package co.xiaowenzi.study;
public class FruitCustomer {
   @SuppressWarnings("static-access")
   public static void main(String[] args){
      //客戶下單香蕉,通知工廠生產
      FruitFactory fruitFactory = new FruitFactory();
      Fruit fruit = fruitFactory.factory("Apple");
      if(fruit!=null){
         fruit.send();
      }else{
         System.out.println("種不出這種水果");
      }
   }
}
與簡單工廠模式相比:多了一個果農種植步奏。
例如簡單工廠是:客戶直接從水果工廠拿到水果,而不管水果是從哪裏來的;
工廠方法:多了果農種植步奏,水果工廠得到客戶需求,需要那種水果,然後通知相應的果農去種植,由果農返回水果到水果工廠,再提供給客戶。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章