前面介绍了简单工厂模式和工厂方法模式,前面两种模式都适用于只有一种产品等级结构的情形。也即只有一个抽象的产品接口
public interface Product {}的情况。例如一个水果农场,只需一个抽象的水果接口作为具体的产品抽象即可。而抽象工厂模式适用于有多个产品等级结构的情形,例如该农场扩大规模不仅产水果,还要产蔬菜。此种情况下会有多个抽象的产品接口,此时可以使用抽象工厂模式。抽象工厂模式的一个示意性系统中几个角色:
/*
* 抽象工厂角色源代码
* 规定了两个工厂方法,分别提供两个不同等级结构的产品对象。
* */
public interface Creator {
/*
* 产品等级结构A的工厂方法
* */
public ProductA factoryA();
/*
* 产品等级结构B的工厂方法
* */
public ProductB factoryB();
}
/*
* 具体工厂ConcreteCreator1的源代码
* */
public class ConcreteCreator1 implements Creator {
/*
* 产品等级结构A的工厂方法
* */
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return new ProductA1();
}
/*
* 产品等级结构B的工厂方法
* */
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return new ProductB1();
}
}
/*
* 具体工厂ConcreteCreator1的源代码
* */
public class ConcreteCreator2 implements Creator {
/*
* 产品等级结构A的工厂方法
* */
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return new ProductA2();
}
/*
* 产品等级结构B的工厂方法
* */
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return new ProductB2();
}
}
/*
* 抽象产品A的源代码
* */
public interface ProductA {
}
/*
* 具体产品A1的源代码
* */
public class ProductA1 implements ProductA {
public ProductA1(){
}
}
/*
* 具体产品A2的源代码
* */
public class ProductA2 implements ProductA {
public ProductA2(){
}
}
/*抽象产品B的源代码*/
public interface ProductB {
}
/*
* 具体产品B1的源代码
* */
public class ProductB1 implements ProductB {
public ProductB1(){
}
}
/*
* 具体产品B2的源代码
* */
public class ProductB2 implements ProductB {
public ProductB2(){
}
}
/*
* 客户端源代码
* */
public class Client {
public static void main(String[] args) {
Creator creator1=new ConcreteCreator1();
ProductA productA1=creator1.factoryA();
ProductB productB1=creator1.factoryB();
Creator creator2=new ConcreteCreator2();
ProductA productA2=creator2.factoryA();
ProductB productB2=creator2.factoryB();
}
}
“开闭原则”要求一个软件系统可以在不修改原来代码的情况下,通过扩展达到其增强功能的目的。那么:
这两种情况的改变,抽象工厂模式会有什么支持呢?
1.增加产品族
这种情况下,设计师只要增加新的具体工厂即可,对于本系统设计师可以增加public class ConcreteCreator2 implements Creator(){}来增加第三个产品族,不用改变原来的代码结构,因此在增加产品族的时候,系统支持“开闭原则”。
2.增加产品等级结构
这种情况下,相当于出现了第三种产品productC,因此不得不改变改变原来的代码,这显然违背了“开闭原则”。
原文:http://www.cnblogs.com/xtsylc/p/4714424.html