针对问题:和工厂方法模式类似,用一个继承体系来实现创建对象的多变性。不同的是,抽象工厂模式针对的是产品族(许多个产品).
抽象工厂模式结构图:
抽象工厂模式实现代码:
/**
* 产品A接口
* @author bruce
*
*/
public abstract class ProductA {
public abstract void descriptionA();
}
/**
* 产品B接口
* @author bruce
*
*/
public abstract class ProductB {
public abstract void descriptionB();
}
/**
* 创建者接口
* @author bruce
*
*/
public abstract class Creator {
public abstract ProductA createProductA();
public abstract ProductB createProductB();
}
/**
* 产品A1(产品A)
* @author bruce
*
*/
public class ProductA1 extends ProductA{
@Override
public void descriptionA() {
// TODO Auto-generated method stub
System.out.println("ProductA:ProductA1");
}
}
/**
* 产品A2(产品A)
* @author bruce
*
*/
public class ProductA2 extends ProductA{
@Override
public void descriptionA() {
// TODO Auto-generated method stub
System.out.println("ProductA:ProductA2");
}
}
/**
* 产品B1(产品B)
* @author bruce
*
*/
public class ProductB1 extends ProductB{
@Override
public void descriptionB() {
// TODO Auto-generated method stub
System.out.println("ProductB:ProductB1");
}
}
/**
* 产品B2(产品B)
* @author bruce
*
*/
public class ProductB2 extends ProductB{
@Override
public void descriptionB() {
// TODO Auto-generated method stub
System.out.println("ProductB:ProductB2");
}
}
/**
* 创建类1
* @author bruce
*
*/
public class ConcreteCreator1 extends Creator{
@Override
public ProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA1();
}
@Override
public ProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
/**
* 创建者2
* @author bruce
*
*/
public class ConcreteCreator2 extends Creator{
@Override
public ProductA createProductA() {
// TODO Auto-generated method stub
return new ProductA2();
}
@Override
public ProductB createProductB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
/**
* 测试
* @author bruce
*/
public class Client {
public static void main(String[] args) {
Creator creator=new ConcreteCreator1();
ProductA pa=creator.createProductA();
ProductB pb=creator.createProductB();
pa.descriptionA(); //ProductA:ProductA1
pb.descriptionB(); //ProductB:ProductB1
creator=new ConcreteCreator2();
pa=creator.createProductA();
pb=creator.createProductB();
pa.descriptionA(); //ProductA:ProductA2
pb.descriptionB(); //ProductB:ProductB2
}
}