意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
结构:
AbstractFactory声明一个创建抽象产品的操作接口
ConcreteFactory实现创建具体产品对象的操作
AbstractProduct为一类产品对象声明一个接口
ConcreteProduct定义一个将被相应的具体工厂创建的产品对象,并且要实现AbstractProduct接口
实现示例:
public abstract class ProductA {
abstract void operationA();
}
public abstract class ProductB {
abstract void operationB();
}
ublic abstract class AbstractFactory {
abstract ProductA getProductA();
abstract ProductB getProductB();
}
public class ProductA1 extends ProductA {
@Override
void operationA() {
System.out.println("ProductA1 operation A1");
}
}
public class ProductB1 extends ProductB {
@Override
void operationB() {
System.out.println("ProductB1 operation B1");
}
}
public class ConcreteFactory1 extends AbstractFactory {
@Override
ProductA getProductA() {
return new ProductA1();
}
@Override
ProductB getProductB() {
return new ProductB1();
}
}
public class ProductA2 extends ProductA {
@Override
void operationA() {
System.out.println("ProductA2 operation A2");
}
}
ublic class ProductB2 extends ProductB {
@Override
void operationB() {
System.out.println("ProductB2 operation B2");
}
}
public class ConcreteFactory2 extends AbstractFactory {
@Override
ProductA getProductA() {
// TODO Auto-generated method stub
return new ProductA2();
}
@Override
ProductB getProductB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
客户端使用代码:
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(args[0]);
AbstractFactory f = null;
switch (Integer.parseInt(args[0])) {
case 1:
System.out.println("select 1 series Factory");
f = new ConcreteFactory1();
break;
case 2:
System.out.println("select 2 series Factory");
f = new ConcreteFactory2();
break;
default:
System.out.println("wrong command parameter");
System.exit(2);
}
ProductA pa = f.getProductA();
ProductB pb = f.getProductB();
pa.operationA();
pb.operationB();
}
}
运行结果:
命令行参数
1 时的结果:
1
select 1 series Factory
ProductA1 operation A1
ProductB1 operation B1
命令行参数
2时的结果:
2
select 2 series Factory
ProductA2 operation A2
ProductB2 operation B2