之间介绍的工厂都是单产品系的,抽象工厂是对应了多产品系,但是产品种类数量相对固定的。
举个例子来说,每个工厂不仅卖面条,还提供饮料,面条和饮料可能不断出新样品,但是还是只卖这两种。
先抽象一个产品类,饮料:
public abstract class IDrinks {
/**
* 描述每种饮料多少钱
*/
public abstract void prices();
}
然后实现两个产品类
可乐
public class ColaDrinks extends IDrinks {
@Override
public void prices() {
System.out.println("可乐三块五");
}
}
矿泉水:
public class WaterDrinks extends IDrinks {
@Override
public void prices() {
System.out.println("和我一样的穷鬼都喝水,不要钱~!");
}
}
组成了一个抽象饭店(抽象工厂类):
public abstract class AbstractFoodFactory {
/**
* 生产面条
*
* @return
*/
public abstract INoodles createNoodles();
/**
* 生产饮料
*/
public abstract IDrinks createDrinks();
}
兰州大酒店(具体工厂类):
public class LzlmFoodFactory extends AbstractFoodFactory {
@Override
public INoodles createNoodles() {
return new LzNoodles();//卖兰州拉面
}
@Override
public IDrinks createDrinks() {
return new WaterDrinks();//卖水
}
}
KFC(具体工厂类):
public class KFCFoodFactory extends AbstractFoodFactory {
@Override
public INoodles createNoodles() {
return new PaoNoodles();//KFC居然卖泡面
}
@Override
public IDrinks createDrinks() {
return new ColaDrinks();//卖可乐
}
}
使用方法
AbstractFoodFactory abstractFoodFactory1 = new KFCFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
abstractFoodFactory1= new LzlmFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
以上就是抽象工厂模式。
分析:
明显,抽象工厂是针对多个产品族,而工厂方法模式是针对一个产品等级结构
抽象工厂是通过组合属性对象发来构建产品,通过派生不同的工厂类去实现不同的产品组合,而工厂方法则是把属性规定好的