抽象工厂模式是工厂模式的升级版本。适用多系列多产品的场景。
先看定义: Provide an interface for creating
families of related or dependent objects without specifying their concrete classes.
假如现在需要向之前工厂模式的例子中加入进口和国产的概念。那应该怎样改呢?
先看客户端代码
public static void main(String[] args) {
// 进口车工厂
AbstractCarFactory importedCarFactory = new ImportedCarFactory();
// 国产车工厂
AbstractCarFactory domesticCarFactory = new DomesticCarFactory();
AbstractAudi importedAudi = importedCarFactory.createAudi();
AbstractAudi domesticAudi = domesticCarFactory.createAudi();
importedAudi.someAudiOnly();
domesticAudi.someAudiOnly();
}
这里我们分别创建了进口车工厂和国产车工厂, 然后就可以让这两个工厂工作了。
运行结果:
引用
Imported Audi.
Domestic Audi.
再看看抽象工厂类
public abstract class AbstractCarFactory {
public abstract AbstractAudi createAudi();
public abstract AbstractBMW createBMW();
public abstract AbstractBenz createBenz();
}
具体的工厂类
public class ImportedCarFactory extends AbstractCarFactory {
@Override
public AbstractAudi createAudi() {
return new ImportedAudi();
}
@Override
public AbstractBMW createBMW() {
return new ImportedBMW();
}
@Override
public AbstractBenz createBenz() {
return new ImportedBenz();
}
}
public class DomesticCarFactory extends AbstractCarFactory {
@Override
public AbstractAudi createAudi() {
return new DomesticAudi();
}
@Override
public AbstractBMW createBMW() {
return new DomesticBMW();
}
@Override
public AbstractBenz createBenz() {
return new DomesticBenz();
}
}
抽象汽车类
public abstract class AbstractAudi implements Car {
public abstract void someAudiOnly();
@Override
public void showCurrentSpeed() {
System.out.println("180");
}
@Override
public void showDes() {
System.out.println("I'm Audi");
}
@Override
public void start() {
System.out.println("Audi started...");
}
@Override
public void stop() {
System.out.println("Audi stoped...");
}
}
具体的汽车类
public class ImportedAudi extends AbstractAudi {
@Override
public void someAudiOnly() {
System.out.println("Imported Audi.");
}
}
public class DomesticAudi extends AbstractAudi {
@Override
public void someAudiOnly() {
System.out.println("Domestic Audi.");
}
}
补充一点: 抽象工厂模式也
不符合开闭原则