简述
前面我们学习过简单工厂模式,它解决了一类对象的创建问题,但是有的时候对象很复杂,数量多,还分为了好几种类别。如果只有一个工厂,面多如此多的产品,这个工厂需要实现的逻辑就太复杂了,所以我们希望把工厂分为好几个,便于产品规则的维护。设计者只需要提供给用户一个抽象工厂,抽象工厂内部会自动选择使用哪个工厂生产哪种产品
案例
- 这里以两种工厂为例,一种生产水果,一种生产文具,代码以打印到控制台的方式来简要说明
- demo代码可到抽象工厂模式中下载
【产品接口】
public interface IProduct {
//案例中不提供实现类,以打印到控制台的方式说明
}
【工厂接口】
/**
* 抽象工厂和具体工厂都要实现本接口
*/
public interface IProductFactory {
public IProduct createProduct(String productNo);
}
【具体工厂1 - 水果】
public class ProductFactory1 implements IProductFactory {
/**
* @param productNo 产品编号
* @return 本具体工厂只负责生产水果,水果编号都以A开头
*/
@Override
public IProduct createProduct(String productNo) {
//这里不提供IProduct的实现类,以打印文字的方法简略表示
if("A1".equals(productNo)){
System.out.println("生产一个苹果");
}else if ("A2".equals(productNo)){
System.out.println("生产一个鸭梨");
}else {
System.out.println("水果工厂暂不生产该水果");
}
return null;
}
}
【具体工厂2 - 文具】
/**
* 本具体工厂只生产文具,产品编号以B开头
*/
public class ProductFactory2 implements IProductFactory {
@Override
public IProduct createProduct(String productNo) {
if("B1".equals(productNo)){
System.out.println("生产了一支笔");
}else if ("B2".equals(productNo)){
System.out.println("生产了一个橡皮");
}else {
System.out.println("本文具工厂暂不生产该文具");
}
return null;
}
}
【抽象工厂】
/**
* 抽象工厂,负责制定某个具体工厂生产某件产品
*/
public class ProductFactory implements IProductFactory {
public IProduct createProduct(String productNo) {
char type = productNo.charAt(0);
IProductFactory factory = null;
if(type == 'A'){
factory = new ProductFactory1();
}else if(type == 'B'){
factory = new ProductFactory2();
}
if(factory != null) factory.createProduct(productNo);
return null;
}
}
【测试】
public class Test {
public static void main(String[] args) {
ProductFactory productFactory = new ProductFactory();
productFactory.createProduct("A1");//生产一个苹果
productFactory.createProduct("A2");//生产一个鸭梨
productFactory.createProduct("B1");//生产了一支笔
productFactory.createProduct("B2");//生产了一个橡皮
}
}