模式动机
在工厂方法模式中具体工厂负责生成具体的产品,每一个具体产品对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或一组重载的工厂方法。但是有的时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器设备工厂,它可以生产电视机、电冰箱、空调等设备,而不只是生产某种类型的电器。为了更清晰地理解抽象工厂模式,需要引入两个概念:
- 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机等,那么抽象电视机和具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
- 产品族:在抽象工厂模式中,产品族是指由同一工厂生产的,位于不同产品等级结构中的一组产品。如海尔工厂生产海尔电视、海尔冰箱等。
模式定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
模式结构
抽象工厂模式结构图如图所示:
1.AbstractFactory(抽象工厂)
抽象工厂用于声明生产抽象产品的方法,在一个抽象工厂中可以定义一组方法,每一个方法对应一个产品等级结构。
2.ConcreteFactory(具体工厂)
具体工厂实现了抽象工厂声明的生产抽象产品的方法,生产一组具体方法,这些产品构成一个产品族,每一个产品都位于某个产品等级结构中。
3.AbstractProduct(抽象产品)
抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法。
4.ConcreteProduct(具体产品)
具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口定义中的业务方法。
实例
一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机,海尔空调等,TCL工厂也可以生产对应的电器。
如图是该实例类图。
// 抽象产品类
public interface Television {
public void play();
}
public interface AirConditioner {
public void changeTemperature();
}
// 具体产品类
public class HaierTelevision implements Television {
public void play() {
System.out.println("海尔电视机播放中.");
}
}
public class TCLTelevision implements Television {
public void play() {
System.out.println("TCL电视机播放中.");
}
}
public class HaierAirConditioner implements AirConditioner {
public void changeTemperature() {
System.out.println("海尔空调控温中");
}
}
public class HaierAirConditioner implements AirConditioner {
public void changeTemperature() {
System.out.println("TCL空调控温中");
}
}
// 抽象工厂类
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}
// 具体工厂类
public class HaierFactory implements EFactory {
public Television produceTelevison() {
return new HaierTelevision();
}
public AirConditioner produceAirConditioner {
return new HaierAirConditioner();
}
}
public class TCLFactory implements EFactory {
public Television produceTelevison() {
return new TCLTelevision();
}
public AirConditioner produceAirConditioner {
return new TCLAirConditioner();
}
}
// 测试
public class Client {
public static void main(String[] args) {
Televison tv;
AirConditioner airConditioner;
EFactory factory = new HaierFactory();
tv = factory.produceTV();
airConditioner = factory.produdeAirConditioner();
tv.play();
airConditioner.changeTemperature();
}
}
本文介绍了抽象工厂模式的概念、结构及应用场景。通过一个电器工厂的例子详细解释了如何使用抽象工厂模式来创建一系列相关或相互依赖的对象,同时保持代码的灵活性和扩展性。
2212

被折叠的 条评论
为什么被折叠?



