抽象工厂模式
- 用来生产不同产品族的全部产品。对新增加的产品无能无力,支持增加产品族。
- 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。(本文示例参考自北京尚学堂java教程,高淇)
产品族:功能相关联的一系列产品的集合。如本文的示例,汽车中的发动机,座椅和轮胎可以看做为一个产品族,他们构成了汽车。
那么如果现在有一个汽车工厂的接口:
这时,引擎有多个子类:
public interface Engine {
void run();
void start();
}
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("好引擎,跑得快!");
}
@Override
public void start() {
System.out.println("好引擎,启动快!");
}
}
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("差引擎,跑得慢···");
}
@Override
public void start() {
System.out.println("差引擎,启动慢···");
}
}
座椅也分档次:
public interface Seat {
void massage();
}
class LuxurySeat implements Seat{
@Override
public void massage() {
System.out.println("高档座椅可以按摩!");
}
}
class LowSeat implements Seat{
@Override
public void massage() {
System.out.println("低端座椅只能坐···");
}
}
轮胎自然也有好坏:
public interface Tyre {
void revolve();
}
class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println("高档轮胎超耐磨!");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println("低端轮胎不耐磨···");
}
}
那么这时候,这个汽车应该如何组装,如何挑选配置呢?
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
于是就出现了抽象工厂,现在我们需要一个高端的汽车,所有配置都是顶级的:
public class LuxuryFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
当然低端车也有市场:
public class LowFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
下面就是生产汽车了:
public class Test {
public static void main(String[] args) {
//产品族
CarFactory factory = new LuxuryFactory();
Engine e = factory.createEngine();
e.start();
e.run();
Seat s = factory.createSeat();
s.massage();
}
}
可以看到输出:
好引擎,启动快!
好引擎,跑得快!
高档座椅可以按摩!
对于每一个产品族,都可以有一个具体工厂。来完成不同产品构成的产品族对象的创建。