抽象工厂模式:简单的说,抽象工厂模式相对于工厂方法模式来讲,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的。在抽象工厂类中,客户端不再需要进行对象的创建,而是具体的工厂类来进行创建,客户端只负责对象的调用。
我们依旧以产品生产为例,可以画出如下抽象工厂模式生产的原理:
我们可以这样想,ProductA和ProductB都有各自的生产属性,即生产哪些内容。也即ProductA.java和ProductB.java。而生产ProductA和ProductB的工厂都需要一些特定的程序,也即方法。对应是FactoryMethod.java 。生产ProductA和ProductB中有两个工厂可以供选择,这两个工厂都继承生产A和B的方法。但是两个工厂因生产工艺的差异导致生产出的A和B又不完全相同。所以又有1工厂生产的A和B,对应ConcreteF1ProductA.java 和ConcreteF1ProductB.java 2工厂生产的A和B对应ConcreteF2ProductA.java 和ConcreteF2ProductB.java。虽然两个工厂生产的A和B工艺不同,但生产的A和B都有相同的属性,所以生产中要继承ProductA和ProductB。对于客户选择不同的代生产工厂,所以结果也不同。对应的是Client.java
根据原理可以写如下示例:
ProductA.java
public interface ProductA {
public String doOperation(String txt);
}
ProductB.java
public interface ProductB {
public String doOperation(String txt);
}
FactoryMethod.java
public abstract class FactoryMethod {
protected abstract ProductA factoryMethodProductA();
protected abstract ProductB factoryMethodProductB();
public String operation(String txt){
ProductA productA =factoryMethodProductA();
ProductB productB =factoryMethodProductB();
return productA.doOperation(txt)+"---"+productB.doOperation(txt);
}
}
ConcreteF1ProductA.java
public class ConcreteF1ProductA implements ProductA{
public String doOperation(String txt){
return "代工厂1生产A产品"+txt;
}
}
ConcreteF1ProductB.java
public class ConcreteF1ProductB implements ProductB {
public String doOperation(String txt){
return "代工厂1生产B产品"+txt;
}
}
ConcreteFactory1Method.java
public class ConcreteFactory1Method extends FactoryMethod{
@Override
protected ProductA factoryMethodProductA() {
// TODO Auto-generated method stub
return new ConcreteF1ProductA();
}
protected ProductB factoryMethodProductB() {
// TODO Auto-generated method stub
return new ConcreteF1ProductB();
}
}
ConcreteF2ProductA.java
public class ConcreteF2ProductA implements ProductA {
public String doOperation(String txt){
return "代工厂2生产A产品"+txt;
}
}
ConcreteF2ProductB.java
public class ConcreteF2ProductB implements ProductB{
public String doOperation(String txt){
return "代工厂2生产B产品"+txt;
}
}
ConcreteFactory2Method.java
public class ConcreteFactory2Method extends FactoryMethod{
protected ProductA factoryMethodProductA() {
// TODO Auto-generated method stub
return new ConcreteF2ProductA();
}
protected ProductB factoryMethodProductB() {
// TODO Auto-generated method stub
return new ConcreteF2ProductB();
}
}
Client.java
public class Client {
public static void main(String[] args) {
FactoryMethod factoryMethod=new ConcreteFactory1Method();
System.out.println(factoryMethod.operation("测试"));
factoryMethod=new ConcreteFactory2Method();
System.out.println(factoryMethod.operation("测试"));
}
}
运行结果:
代工厂1生产A产品测试—代工厂1生产B产品测试
代工厂2生产A产品测试—代工厂2生产B产品测试