刚刚的简单工厂模式只提供一种类别的产品,那么抽象工厂能实现多种产品组合。
 简单工厂模式
 假设我们不仅需要手机,还感觉口渴了,需要饮料怎么办呢。
 首先定义一个饮料的接口。
public interface Drink {
    void provide();
}
 
具体实现类
public class BlackTea implements Drink{
    @Override
    public void provide() {
        System.out.println("提供红茶");
    }
}
 
public class GreenTea implements Drink{
    @Override
    public void provide() {
        System.out.println("提供绿茶");
    }
}
 
public class Cola implements Drink{
    @Override
    public void provide() {
        System.out.println("提供可乐");
    }
}
 
我们现在有两个产品线,手机和饮料。
 我们先创建一个抽象工厂,抽象类需要有获取产品的方法。
public abstract class AbstractFactory {
    public abstract Phone getPhone(String phoneType);
    public abstract Drink getDrink(String drinkType);
}
 
然后创建具体的工厂类,继承上面的抽象类。
public class DrinkFactory extends AbstractFactory{
    @Override
    public Phone getPhone(String phone) {
        return null;
    }
    @Override
    public Drink getDrink(String drinkType){
        if (drinkType ==null){
            return null;
        }
        if (drinkType.equalsIgnoreCase("BlackTea")){
            return new BlackTea();
        }else if (drinkType.equalsIgnoreCase("GreenTea")){
            return new GreenTea();
        }else if (drinkType.equalsIgnoreCase("Cola")){
            return new Cola();
        }else
            return null;
    }
}
 
public class PhoneFactory extends AbstractFactory{
    @Override
    public Phone getPhone(String phoneType){
        if (phoneType ==null){
            return null;
        }
        if (phoneType.equalsIgnoreCase("XiaoMi")){
            return new XiaoMi();
        }else if (phoneType.equalsIgnoreCase("HuaWei")){
            return new HuaWei();
        }else if (phoneType.equalsIgnoreCase("ViVo")){
            return new ViVo();
        }else
            return null;
    }
    @Override
    public Drink getDrink(String drinkType) {
        return null;
    }
}
 
这里新建一个工厂提供类进行工厂的创建。
public class FactoryProducer {
    public static AbstractFactory getFactory(String type){
        if (type.equalsIgnoreCase("Phone")){
            return new PhoneFactory();
        }else if (type.equalsIgnoreCase("Drink")){
            return new DrinkFactory();
        }
        return null;
    }
}
 
测试用例
public static void main(String[] args) {
        AbstractFactory drinkFactory = FactoryProducer.getFactory("drink");
        Drink cola = drinkFactory.getDrink("Cola");
        cola.provide();
        AbstractFactory phoneFactory = FactoryProducer.getFactory("phone");
        Phone xiaomi = phoneFactory.getPhone("xiaomi");
        xiaomi.brand();
    }
 
通过抽象工厂就能进行产品线的组合。










