1.3_抽象工廠模式

抽象工廠模式的各個角色(和工廠方法的一樣):
抽象工廠角色:這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。在java中它由具體的類來實現。
抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。
它和工廠方法模式的區別就在於需要創建對象的複雜程度上。而且抽象工廠模式是三個裏面最爲抽象、最具一般性的。抽象工廠模式的用意爲:給客戶端提供一個接口,可以創建多個產品族中的產品對象。而且使用抽象工廠模式還要滿足一下條件:
1.系統中有多個產品族,而系統一次只可能消費其中一族產品
2.同屬於同一個產品族的產品以其使用。
蘋果種類
package co.xiaowenzi.study;
public interface Apple{
    public void appleType();
}
 
package co.xiaowenzi.study;
public class AppleBig implements Apple{
    @Override
    public void appleType() {
       System.out.println("大蘋果");
    }
}
 
package co.xiaowenzi.study;
public class AppleSmall implements Apple{
    @Override
    public void appleType() {
       System.out.println("小蘋果");
    }
}
 
香蕉種類
package co.xiaowenzi.study;
public interface Banana{
    public void bananaType();
}
 
package co.xiaowenzi.study;
public class BananaBig implements Banana{
    @Override
    public void bananaType() {
       System.out.println("大香蕉");
    }
}
 
package co.xiaowenzi.study;
public class BananaSmall implements Banana{
    @Override
    public void bananaType() {
       System.out.println("小香蕉");
    }
}
 
果農:種植大蘋果和大香蕉/種植小蘋果和小香蕉
package co.xiaowenzi.study;
public interface Farmer {
    public Apple PlantAppleTree();
    public Banana PlantBananaTree();
}
 
package co.xiaowenzi.study;
public class FarmerBig implements Farmer {
    @Override
    public Apple PlantAppleTree() {
       return new AppleBig();
    }
    @Override
    public Banana PlantBananaTree() {
       return new BananaBig();
    }
}
 
package co.xiaowenzi.study;
public class FarmerSmall implements Farmer {
    @Override
    public Apple PlantAppleTree() {
       return new AppleSmall();
    }
    @Override
    public Banana PlantBananaTree() {
       return new BananaSmall();
    }
}
 
工廠
package co.xiaowenzi.study;
public class FruitFactory {
    /**
     * 水果工廠,等待客戶下單進行生產
     * @param which
     * @return
     * @throwsException
     */
    public static Farmer factory(String which) {
       // 利用反射來知道那種水果,找到對應的果農種植
       Farmer farmer = null;
       if (which.equals("Big")) {
           farmer = new FarmerBig();
        }elseif (which.equals("Small")) {
           farmer = new FarmerSmall();
       }
       return farmer;
    }
}
 
客戶
package co.xiaowenzi.study;
public class FruitCustomer {
    @SuppressWarnings(" static -access")
    public static void main(String[] args){
       //客戶下單香蕉,通知工廠生產
       FruitFactory fruitFactory = new FruitFactory();
       Farmer farmer = fruitFactory.factory("Big");
       if(farmer!=null){
           Apple apple = farmer.PlantAppleTree();
           Banana banana = farmer.PlantBananaTree();
           apple.appleType();
           banana.bananaType();
       }else{
           System.out.println("沒有這個農民");
       }
    }
}
與工廠方法不同的是:工廠方法是一種水果對應一個果農,例如蘋果果農只有一種蘋果種類;抽象工廠是一類水果對應一個果農,蘋果果農可能有多種種類的蘋果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章