定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口。
为了更好的学习抽象工厂模式先来了解下产品等级和产品族,相同的产品等级就是相同的产品,像美的冰箱、格力冰箱、海尔冰箱,它们都是冰箱,它们的产品等级都相同,虽然厂家不同。美的冰箱、美的空调和美电风扇,他们虽然不是同一个产品等级的,但是他们都来自同一家厂商美的,因此他们的产品族相同。
抽象工厂是创建型设计模式,它强调了一系列相关产品对象(属于同一个产品族)的创建过程,它和工厂方法模式的侧重点不同,工厂方法模式更加侧重于同一产品等级,而抽象工厂模式侧重的是同一产品族。简单说就是一个工厂中生产的一系列对象都是同一个产品族的。
还是用冰箱来举例,美的生产的产品有美的冰箱、美的空调、美的电风扇。
首先创建三个接口:
//空调
public interface AirConditioner {
void airConditionerInfo();
}
//风扇
public interface Fan {
void fanInfo();
}
//冰箱
public interface Fridge {
void fridgeInfo();
}
创建具体的产品:美的冰箱、美的风扇、美的空调。
public class MediaAirConditioner implements AirConditioner {
@Override
public void airConditionerInfo() {
System.out.println("美的空调");
}
}
public class MediaFan implements Fan {
@Override
public void fanInfo() {
System.out.println("美的风扇");
}
}
public class MediaFridge implements Fridge{
@Override
public void fridgeInfo() {
System.out.println("美的冰箱");
}
}
类图如下
它们都是同一个产品族的,都是美的旗下的产品。
抽象工厂:
public interface Factory {
Fridge createFridge();
AirConditioner createAirConditioner();
Fan createFan();
}
美的工厂
public class MediaFactory implements Factory{
@Override
public Fridge createFridge() {
// TODO Auto-generated method stub
return new MediaFridge();
}
@Override
public AirConditioner createAirConditioner() {
// TODO Auto-generated method stub
return new MediaAirConditioner();
}
@Override
public Fan createFan() {
// TODO Auto-generated method stub
return new MediaFan();
}
}
可以看到,在这个工厂里面生产的所有产品对象都不是同一个产品等级的,它们属于同一个产品族,该工厂生产的一系列对象都是相关的。就像定义说的:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口。如果现在我们希望生产海尔的一系列产品就可以扩展抽象产品接口创建一系列海尔产品类,创建海尔的工厂负责生产海尔的产品。
想生产格力的只需要进行扩展对应的产品和工厂就好了,从这点看完全遵循开闭原则。不过抽象工厂模式的不足也很明显,如果美的现在又搞洗衣机了,就需要修改接口和所有的实现类,因此对于扩展一个新的产品等级来说,不遵循开闭原则。
测试:
public class Test {
public static void main(String[] args) {
Factory factory=new HaierFactory();
AirConditioner airConditioner=factory.createAirConditioner();
Fan fan=factory.createFan();
Fridge fridge=factory.createFridge();
airConditioner.airConditionerInfo();
fan.fanInfo();
fridge.fridgeInfo();
}
}