美文网首页
java抽象工厂

java抽象工厂

作者: 韩明泽 | 来源:发表于2019-06-07 16:40 被阅读0次

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

  • 定义:提供一个创建一系列相关或相互依赖的对象的接口
  • 无序指定他们具体的类
  • 类型:创建型

适用场景

  • 客户端(应用层)不需要依赖与产品类实例如何被创建、实现细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

产品接口

优点

  • 具体产品在应用层代码隔离,无需关心创建细节
  • 将一个系列的产品族统一到一起创建

缺点

  • 规定了所有可能被创建的产品集合,产品组种扩展新的产品比较困难,需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

分析:

  • 抽象方法是对工厂方法的进一步拓展
  • 工厂工厂方法针对的是产品等级结构
  • 抽象方法针对于的是产品族
  • 加入我们想要创建海尔冰箱、海尔洗衣机、海尔空调;格力冰箱、格力洗衣机、格力空调;美的冰箱、美的洗衣机、美的空调;如果我们采用工厂方法的话,就需要9个工厂类,如果采用抽象工厂则需要3个类就可以完成。因此抽象工厂相比较工厂方法极大的减少了类的创建

案例:

/**
 * 空调
 */
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类图

简略版 详细版 自己以前话的类图

相关文章

网友评论

      本文标题:java抽象工厂

      本文链接:https://www.haomeiwen.com/subject/xyxvxctx.html