一、理解
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
二、举例
到4S店买车的时候,会给销售顾问说想看的具体车型,比如A4L和A6L,销售顾问会带你看现车,而不会带你去生产厂家去看发动机,空调,车轮等其他配件。生产这个车的地方就是一个超级工厂,超级工厂里边呢,会有一系列从其他工厂已经生产好的配件,比如车轮的轮胎来自米其林,轮毂来自BBS。
三、图示
四、代码
产品类
//发动机以及型号
public interface Engine {
}
public class EngineA4L implements Engine{
public Engine(){
System.out.println("制造发动机-->EngineA4L");
}
}
public class EngineA6L implements Engine{
public Engine(){
System.out.println("制造发动机-->EngineA6L");
}
}
//轮胎及型号
public interface Wheel{
}
public class WheelA4L implements Wheel{
public Wheel(){
System.out.println("制造轮胎-->WheelA4L");
}
}
public class WheelA6L implements Wheel{
public Wheel(){
System.out.println("制造轮胎-->WheelA6L");
}
}
//大灯及型号
public interface Lights{
}
public class LightsA4L implements Lights{
public Lights(){
System.out.println("制造大灯-->LightsA4L");
}
}
public class LightsA6L implements Lights{
public Lights(){
System.out.println("制造大灯-->LightsA6L");
}
}
创建工厂类
//创建工厂的接口
public interface AbstractFactory {
//制造发动机
public Engine createEngine();
//制造轮胎
public Wheel createWheel();
//制造大灯
public Lights createLights();
}
//生产奥迪A4L系列
public class FactoryAudiA4L implements AbstractFactory{
@Override
public Engine createEngine() {
return new EngineA4L();
}
@Override
public Wheel createWheel() {
return new WheelA4L();
}
@Override
public Lights createLights() {
return new LightsA4L();
}
}
//生产奥迪A6L系列
public class FactoryAudiA6L implements AbstractFactory{
@Override
public Engine createEngine() {
return new EngineA6L();
}
@Override
public Wheel createWheel() {
return new WheelA6L();
}
@Override
public Lights createLights() {
return new LightsA6L();
}
}
客户端调用
public class Customer {
public static void main(String[] args){
//要一台奥迪A4L
FactoryAudiA4L factory = new FactoryAudiA4L();
factory.createEngie();
factory.createWheel();
factory.createLights();
//要一台奥迪A6L
FactoryAudiA6L factory = new FactoryAudiA6L();
factory.createEngie();
factory.createWheel();
factory.createLights();
}
}