java抽象工厂

2019-06-07  本文已影响0人  韩明泽

有时候我们希望一个工厂可以生产多种产品,比如冰箱冰箱工厂中既可以生产冰箱又可以生产洗衣机、空调。很显然我们上篇文章中介绍的工厂方法是不能满足我们的需求,这个时候我们就需要用到抽象工厂。

适用场景

产品接口

优点

缺点

分析:

案例:

/**
 * 空调
 */
public interface IAirConditioner {
    //品牌
    String brand();
    //制冷
    void refrigeration();
    //制热
    void heating();
}
/**
 * 洗衣机
 */
public interface IWasher {
    String brand();
    //洗涤
    void washing();
}
/**
 * 冰箱
 */
public interface IRefrigerator {
    String brand();
    //储藏
    void coldStorage();
    //冷冻
    void freeze();
}

产品实现类

海尔家电产品

/**
 * 海尔空调
 */
 class HaiErAirConditioner implements IAirConditioner {
    @Override
    public String brand() {
        return "海尔空调";
    }
    @Override
    public void refrigeration() {
        System.out.println("开启制冷模式");
    }
    @Override
    public void heating() {
        System.out.println("开启制热模式");
    }
}
/**
 * 海尔洗衣机
 */
 class HaiErWasher implements IWasher {
    @Override
    public String brand() {
        return "海尔洗衣机";
    }
    @Override
    public void washing() {
        System.out.println("标准洗涤");
    }
}
/**
 * 海尔冰箱
 */
 class HaiErRefrigerator implements IRefrigerator {
    @Override
    public String brand() {
        return "海尔冰箱";
    }

    @Override
    public void coldStorage() {
        System.out.println("冷藏室");
    }
    @Override
    public void freeze() {
        System.out.println("冷冻室");
    }
}

格力家电产品

/**
 * 格力空调
 */
 class GeLiAirConditioner implements IAirConditioner {
    @Override
    public String brand() {
        return "格力空调";
    }
    @Override
    public void refrigeration() {
        System.out.println("开启制冷模式");
    }

    @Override
    public void heating() {
        System.out.println("开启制热模式");
    }
}
/**
 * 格力洗衣机
 */
 class GeLiWasher implements IWasher {
    @Override
    public String brand() {
        return "格力洗衣机";
    }
    @Override
    public void washing() {
        System.out.println("标准洗涤");
    }
}
/**
 * 格力冰箱
 */
 class GeLiRefrigerator implements IRefrigerator {
    @Override
    public String brand() {
        return "格力冰箱";
    }
    @Override
    public void coldStorage() {
        System.out.println("冷藏室");
    }
    @Override
    public void freeze() {
        System.out.println("冷冻室");
    }
}

美的家电工厂产品
美的家电产品,同上分别集成IAirConditionerIRefrigeratorIWasher三个接口由于篇幅原因,就不在这里粘贴了

抽象工厂接口

/**
 * 家电
 */
public interface IHomeApplianceFactory {
    //洗衣机
    IWasher getWasher();
    //空调
    IAirConditioner getAirConditioner();
    //冰箱
    IRefrigerator getRefrigerator();
}

抽象工厂实现类

/**
 * 海尔家电工厂
 */
public class HaiErHomeApplianceFactory implements IHomeApplianceFactory {
    @Override
    public IWasher getWasher() {
        return new HaiErWasher();
    }
    @Override
    public IAirConditioner getAirConditioner() {
        return new HaiErAirConditioner();
    }
    @Override
    public IRefrigerator getRefrigerator() {
        return new HaiErRefrigerator();
    }
}
/**
 * 格力工厂
 */
public class GeLiHomeApplianceFactory implements IHomeApplianceFactory {
    @Override
    public IWasher getWasher() {
        return new GeLiWasher();
    }
    @Override
    public IAirConditioner getAirConditioner() {
        return new GeLiAirConditioner();
    }
    @Override
    public IRefrigerator getRefrigerator() {
        return new GeLiRefrigerator();
    }
}

/**
 * 美的家电工厂 同上需要基础IHomeApplianceFactory
 */
....

测试代码

public static void main(String[] args) {
    //洗衣机
    IWasher washer = new GeLiHomeApplianceFactory().getWasher();
    String washerBrand = washer.brand();
    System.out.println("品牌:" + washerBrand);
    washer.washing();
    //冰箱
    IRefrigerator refrigerator = new HaiErHomeApplianceFactory().getRefrigerator();
    String refrigeratorBrand = refrigerator.brand();
    System.out.println("品牌:" + refrigeratorBrand);
    refrigerator.coldStorage();
    refrigerator.freeze();
    //空调
    IAirConditioner airConditioner = new MeiDiHomeApplianceFactory().getAirConditioner();
    String airConditionerBrand = airConditioner.brand();
    System.out.println("品牌:" + airConditionerBrand);
    airConditioner.heating();
    airConditioner.refrigeration();
}

日志结果

品牌:格力洗衣机
标准洗涤
品牌:海尔冰箱
冷藏室
冷冻室
品牌:美的空调
开启制热模式
开启制冷模式

UML类图

简略版 详细版 自己以前话的类图
上一篇下一篇

猜你喜欢

热点阅读