抽象工厂模式(Abstract Factory)
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。来看下抽象工厂模式的类图:
前面咱们说的工厂模式,类的创建依赖工厂类,程序需要扩展时,我们必须创建新的工厂类。工厂类是用来生产产品的,那我们也可以把“工厂类当成我们要生产的产品”,所以抽象工厂就是“工厂的工厂”,即生产工厂的工厂。
通过一个例子,来加深对抽象工厂的理解。
public interface CPUFactory {
public void createCPU();
}
public class IntelCPU implements CPUFactory {
@Override
public void createCPU() {
System.out.println("Intel CPU");
}
}
public class AMDCPU implements CPUFactory {
@Override
public void createCPU() {
System.out.println("AMD CPU");
}
}
public interface Provider {
public CPUFactory createCPUFactory();
}
public class InterCPUFactory implements Provider {
@Override
public CPUFactory createCPUFactory() {
return new InterCPU();
}
}
public class AMDCPUFactory implements Provider {
@Override
public CPUFactory createCPUFactory() {
return new AMDCPU();
}
}
public static void main(String[] args) {
Provider cpufactory = new InterCPUFactory();
CPUFactory intelcpu = cpufactory.createCPUFactory();
intelcpu.createCPU();
}
总结
抽象工厂的优点:
- 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联(例如不同厂商生产CPU)。
适用场景:
- 一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。
Test
package com.qbz.test;
interface CarFactory {
void productCar();
}
interface Provider {
CarFactory creatCarFactory();
}
class PorscheFactory implements CarFactory {
@Override
public void productCar() {
System.out.println("生产保时捷汽车");
}
}
class TractorFactory implements CarFactory {
@Override
public void productCar() {
System.out.println("生产拖拉机");
}
}
class SuperPorscheFactory implements Provider {
@Override
public CarFactory creatCarFactory() {
return new PorscheFactory();
}
}
class SuperTractorFactory implements Provider {
@Override
public CarFactory creatCarFactory() {
return new TractorFactory();
}
}
public class AbstractFactory {
public static void main(String[] args) {
Provider cf = new SuperPorscheFactory();
CarFactory pf = cf.creatCarFactory();
pf.productCar();
Provider tr = new SuperTractorFactory();
CarFactory tf = tr.creatCarFactory();
tf.productCar();
}
}
输出:
生产保时捷汽车
生产拖拉机