说明
抽象工厂(Abstract Factory)模式是一种工厂模式。用一个接口类中的不同方法创建不同的产品。
为了便于理解,先打个比方:
将老虎、狮子、猴子比作三个抽象产品的接口类,也就是有3个产品等级。
老虎又分动物园的老虎、野生的老虎 --- 比作具体产品
狮子又分动物园的狮子、野生的狮子 --- 比作具体产品
猴子又分动物园的猴子、猴子的猴子 --- 比作具体产品
动物园的动物比作一个产品族,野生的动物比作另外一个产品族,共2个产品族。
抽象工厂模式就是用一个接口中的三个方法分别创建老虎、狮子、猴子。
具体工厂实现抽象工厂,对应有两个具体工厂:动物园具体工厂、野生具体工厂。
动物园具体工厂生产动物园老虎、动物园狮子、动物园猴子。
野生具体工厂生产野生老虎、野生狮子、野生猴子。
概况起来说:
- 有两个产品族:动物园的动物、野生动物。
- 每个产品族中有三个产品等级:老虎、狮子、猴子。
抽象工厂模式涉及如下角色:
- 抽象工厂(Abstract Factory)角色:它一般是一个接口类或者一个抽象类。其中声明了生产一族产品的所有方法。产品族中有几个产品等级就有几个方法。与具体的业务逻辑无关。
- 具体工厂类(Concrete Factory):实现抽象工厂的方法。有几个产品族就有几个具体工厂类。客户端直接调用具体工厂类创建具体的产品。与具体的业务逻辑有关。
- 抽象产品(Abstract Product)角色:一般是一个接口或者抽象类,是具体产品的父类。具体产品要实现抽象产品。
- 具体产品(Concrete Product)角色:实现抽象产品,是客户端最终需要的产品。
代码示例
以上面打的比方来举例。
定义抽象产品
老虎接口:
package com.thb;
public interface Tiger {
}
狮子接口:
package com.thb;
public interface Lion {
}
猴子接口:
package com.thb;
public interface Monkey {
}
定义具体产品
动物园老虎:
package com.thb;
public class ZooTiger implements Tiger {
}
动物园狮子:
package com.thb;
public class ZooLion implements Lion {
}
动物园猴子:
package com.thb;
public class ZooMonkey implements Monkey {
}
野生老虎:
package com.thb;
public class WildTiger implements Tiger {
}
野生狮子:
package com.thb;
public class WildLion implements Lion {
}
野生猴子:
package com.thb;
public class WildMonkey implements Monkey {
}
定义抽象工厂
package com.thb;
public interface Factory {
Tiger createTiger();
Lion createLion();
Monkey createMonkey();
}
定义具体工厂
动物园工厂:
package com.thb;
public class ZooFactory implements Factory {
@Override
public Tiger createTiger() {
return new ZooTiger();
}
@Override
public Lion createLion() {
return new ZooLion();
}
@Override
public Monkey createMonkey() {
return new ZooMonkey();
}
}
野生工厂:
package com.thb;
public class WildFactory implements Factory {
@Override
public Tiger createTiger() {
return new WildTiger();
}
@Override
public Lion createLion() {
return new WildLion();
}
@Override
public Monkey createMonkey() {
return new WildMonkey();
}
}