抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用java接口或者抽象java类实现,而所有的具体工厂类必须实现这个java接口或者继承这个抽象的java类。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体java类实现这个角色。
抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用java接口或者抽象java类实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这个客户端最终想要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体java类实现这个角色。
在简单工厂模式和工厂方法模式中提到的农场系统, 在抽象工厂模式中的设计图如下:
首先看其抽象工厂角色:
public interface Garder {
public Fruit createFruit(String name);
public Vegetable createVegetable(String name);
}
然后是具体工厂角色:
public class NorthernGarder implements Garder{
public Fruit createFruit(String name){
return new NorthernFruit(name);
}
public Vegetable createVegetable(String name){
return new NorthernVegetable(name);
}
}
public class TropicalGarder implements Garder {
public Fruit createFruit(String name){
return new TropicalFruit(name);
}
public Vegetable createVegetable(String name){
return new TropicaVegetable(name);
}
}
接着是抽象产品角色:
public interface Fruit {}
public interface Vegetable {}
然后是具体产品角色:
public class NorthernFruit implements Fruit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public NorthernFruit(String name){
System.out.println("您生产的是亚热带水果");
this.name = name;
}
}
public class TropicalFruit implements Fruit {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TropicalFruit(String name){
System.out.println("您生产的是热带水果");
this.name = name;
}
}
public class NorthernVegetable implements Vegetable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public NorthernVegetable(String name){
System.out.println("您生产的是亚热带蔬菜");
this.name = name;
}
}
public class TropicaVegetable implements Vegetable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TropicaVegetable(String name){
System.out.println("您生产的是热带蔬菜");
this.name = name;
}
}
最后是客户端测试程序:
public class Test {
private static Fruit tropicalFruit, northernFruit;
private static Vegetable tropicalVegetable, northernVegetable;
private static Garder tropicalGarder, northernGarder;
public static void main(String[] args) {
tropicalGarder = new TropicalGarder();
northernGarder = new NorthernGarder();
tropicalFruit = tropicalGarder.createFruit("热带水果");
tropicalVegetable = tropicalGarder.createVegetable("热带蔬菜");
northernFruit = northernGarder.createFruit("亚热带水果");
northernVegetable = northernGarder.createVegetable("亚热带蔬菜");
}
}
输出结果如下:
您生产的是热带水果
您生产的是热带蔬菜
您生产的是亚热带水果
您生产的是亚热带蔬菜