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("没有这个农民");
       }
    }
}
与工厂方法不同的是:工厂方法是一种水果对应一个果农,例如苹果果农只有一种苹果种类;抽象工厂是一类水果对应一个果农,苹果果农可能有多种种类的苹果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章