針對問題:和工廠方法模式類似,用一個繼承體系來實作建立對象的多變性。不同的是,抽象工廠模式針對的是産品族(許多個産品).
抽象工廠模式結構圖:
抽象工廠模式實作代碼:
/**
* 産品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
}
}