概念
抽象工厂模式的功能
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。从某种意义上讲,抽象工厂其实是一个产品系列,或者产品族。
实现成接口
AbstractFactory在java中通常实现成接口。当然如果需要为这个产品族提供公共的功能,可以可以将AbstractFactory实现成为抽象类,不过一般不这么做。
使用工厂方法
AbstractFactory定义了创建产品所需要的接口,具体的实现是在实现类里面,通常在实现类里面就需要选择多种更具体的实现。所以AbstractFactory定义创建产品的方法可以看成是工厂方法,而这些工厂方法的具体实现就延伸到了具体的子类工厂里面。也就是说使用工厂方法来实现抽象工厂。
切换产品族
由于抽象工厂定义的一系列对象通常是相关或相互依赖的,这些产品对象就构成了一个产品族,也就是抽象工厂定义了一个产品族。这样就带来了非常大的灵活性,切换一个产品族时,只需要提供不同的抽象工厂实现就可以了,也就是说现在是以一个产品族作为整体被切换了。
抽象工厂模式是工厂方法模式的升级版,它用来创建一组相关或者相互依赖的对象。当每个抽象产品都有多于一个的具体子类的时候。工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品都有两个具体产品,抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每个具体工厂角色只负责一个产品角色的实例化。每个具体工厂类只负责创建抽象产品的某个具体子类的实例。
代码实现
/**
* @Description 产品类,引擎
*/
public interface Engine {
}
/**
* @Description 具体产品,引擎A
*/
public class EngineA implements Engine {
public EngineA(){
System.out.println("引擎A");
}
}
/**
* @Description 具体产品、引擎B
*/
public class EngineB implements Engine {
public EngineB(){
System.out.println("引擎B");
}
}
/**
* @Description 产品,空调
*/
public interface AirCondition {
}
/**
* @Description 具体产品,空调A
*/
public class AirConditionA implements AirCondition {
public AirConditionA(){
System.out.println("空调A");
}
}
/**
* @Description 具体产品、空调B
*/
public class AirConditionB implements AirCondition {
public AirConditionB(){
System.out.println("空调B");
}
}
/**
* @Description 抽象工厂
*/
public interface AbstractFactory {
// 制造引擎
Engine createEngine();
// 制造空调
AirCondition createAirCondition();
}
/**
* @Description 具体工厂A,创建A系列汽车配件
*/
public class CarAFactory implements AbstractFactory {
@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public AirCondition createAirCondition() {
return new AirConditionA();
}
}
/**
* @Description 具体工厂B,创建B系列汽车配件
*/
public class CarBFactory implements AbstractFactory {
@Override
public Engine createEngine() {
return new EngineB();
}
@Override
public AirCondition createAirCondition() {
return new AirConditionB();
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory carAFactory = new CarAFactory();
carAFactory.createEngine();
carAFactory.createAirCondition();
System.out.println("-----------------");
AbstractFactory carBFactory = new CarBFactory();
carBFactory.createEngine();
carBFactory.createAirCondition();
}
}
运行结果:
引擎A
空调A
-----------------
引擎B
空调B