有时候我们希望一个工厂可以生产多种产品,比如冰箱冰箱工厂中既可以生产冰箱又可以生产洗衣机、空调。很显然我们上篇文章中介绍的工厂方法是不能满足我们的需求,这个时候我们就需要用到抽象工厂。
- 定义:提供一个创建一系列相关或相互依赖的对象的接口
- 无序指定他们具体的类
- 类型:创建型
适用场景
- 客户端(应用层)不需要依赖与产品类实例
如何被创建、实现细节
等 - 强调一系列相关的产品对象(属于
同一产品族
)一起使用创建对象需要大量重复代码 - 提供一个产品类的库,所有的产品以
同样的接口出现
,从而使客户端不依赖于具体实现
产品接口
优点
- 具体产品在应用层
代码隔离,无需关心创建细节
- 将一个系列的
产品族统一到一起创建
缺点
- 规定了所有可能被创建的产品集合,产品组种扩展新的产品比较困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和理解难度
分析:
- 抽象方法是对工厂方法的进一步拓展
- 工厂工厂方法针对的是产品等级结构
- 抽象方法针对于的是产品族
- 加入我们想要创建海尔冰箱、海尔洗衣机、海尔空调;格力冰箱、格力洗衣机、格力空调;美的冰箱、美的洗衣机、美的空调;如果我们采用工厂方法的话,就需要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("冷冻室");
}
}
美的家电工厂产品
美的家电产品,同上分别集成IAirConditioner
、IRefrigerator
、IWasher
三个接口由于篇幅原因,就不在这里粘贴了
抽象工厂接口
/**
* 家电
*/
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();
}
日志结果
品牌:格力洗衣机
标准洗涤
品牌:海尔冰箱
冷藏室
冷冻室
品牌:美的空调
开启制热模式
开启制冷模式
网友评论