之前介绍了工厂模式的前两种:(文章链接:简单工厂模式 / 工厂方法模式)本篇介绍抽象工厂模式。
1、定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
2、模式结构:(和工厂方法模式一样)
(1)AbstractFactory(抽象工厂):用于声明生成抽象产品的方法,可以定义一组方法。
(2)ConcreteFactory(具体工厂):实现抽象工厂声明生成抽象产品的方法。
(3)AbstractProduct(抽象产品):为每种产品声明接口。
(4)ConcreteFactory(具体产品):实现抽象产品接口中的业务方法,定义具体工厂生产的具体产品对象。
3、案例分析(电器工厂)
(1)抽象产品类 TV
public interface TV
{
public void play();
}
(2)具体产品类 HaierTV
public class HaierTV implements TV
{
public void play()
{
System.out.println("海尔电视机播放中。。。");
}
}
(3)具体产品类 MiTV
public class MiTV implements TV
{
public void play()
{
System.out.println("小米电视机播放中。。。");
}
}
(4)抽象产品类 AirConditioner
public interface AirConditioner
{
public void inUse();
}
(5)具体产品类 HaierAirConditioner
public class HaierAirConditioner implements AirConditioner
{
public void inUse(){
System.out.println("海尔空调使用中。。。");
}
}
(6)具体产品类 MiAirConditioner
public class MiAirConditioner implements AirConditioner
{
public void inUse(){
System.out.println("小米空调使用中。。。");
}
}
(7)抽象工厂类 EFactory
public interface EFactory
{
public TV produceTV();
public AirConditioner produceAirConditioner();
}
(8)具体工厂类 HaierFactory
public class HaierFactory implements EFactory
{
public TV produceTV(){
return new HaierTV();
}
public AirConditioner produceAirConditioner(){
return new HaierAirConditioner();
}
}
(9)具体工厂类 MiFactory
public class MiFactory implements EFactory
{
public TV produceTV(){
return new MiTV();
}
public AirConditioner produceAirConditioner(){
return new MiAirConditioner();
}
}
4、模式优缺点:
(1)优点:一个产品族中的多个对象被设计一起使用,能保证客户始终只使用同一个产品族的对象;增加新的具体工厂和产品族简单方便。
(2)缺点:具体工厂实现了抽象工厂接口,故增加新产品的特有功能不被允许。
5、模式应用:Java 中 AWT 中使用抽象工厂模式实现不同操作系统中应用外观界面的一致性。
6、三种模式的比较:
简单工厂模式:提供一个工厂用于生产所有产品,添加新产品时必须将该产品的生产逻辑写入这个唯一的工厂。
工厂方法模式:在简单工厂的基础上将工厂分解为抽象工厂和具体工厂,添加新产品时需要创建生产该产品的具体工厂,该具体工厂必须继承或实现抽象工厂。
抽象工厂模式:在工厂方法的基础上增加了产品族,抽象工厂可定义产品族的多个产品的方法,具体工厂创建产品族的所有产品。