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("沒有這個農民");
}
}
}
與工廠方法不同的是:工廠方法是一種水果對應一個果農,例如蘋果果農只有一種蘋果種類;抽象工廠是一類水果對應一個果農,蘋果果農可能有多種種類的蘋果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.