抽象工厂模式用于创建一系列相关或者相互依赖对象,而无需指定具体的类。和工厂模式一样,它包括以下角色:
- Factory:抽象的工厂,声明工厂方法,该方法返回一个Product类型的对象
- ConcreteFactory:工厂的实现,重写了工厂方法,并返回ConcreteProduct实例
- Product:工厂生产出来的抽象产品
- ConcreteProduct:具体的产品
考虑如下场景:KFC出售2种套餐,一种经济型包含鸡翅和可乐,另一种高档型,包含鸡腿和咖啡。用于只要指出需要的套餐名字就可以获得相应的食品,这种情况下,工厂模式就不再适用了。因为工厂模式每个子工厂只负责生产相互独立的产品,它不适用于一次创建一个“产品套餐”,而抽象工厂模式正是在此方面进行了改进:
//产品族1:KFC食品
abstract class KFCFood {
public abstract void show();
}
class Chicken extends KFCFood {
public void show() {
System.out.println("鸡腿+1");
}
}
class Wings extends KFCFood {
public void show() {
System.out.println("鸡翅+1");
}
}
//产品族2:KFC饮料
abstract class KFCDrink {
public abstract void show();
}
class Cola extends KFCDrink {
public void show() {
System.out.println("可乐+1");
}
}
class Coffee extends KFCDrink {
public void show() {
System.out.println("咖啡+1");
}
}
//抽象工厂,生产套餐
interface IKFCFactory {
KFCFood createFood();
KFCDrink createDrink();
}
//经济型套餐,包括鸡翅和可乐
class CheapPackageFactory implements IKFCFactory {
public KFCFood createFood() {
return new Wings();
}
public KFCDrink createDrink() {
return new Cola();
}
}
//高档型套餐,包括鸡腿和咖啡
class DearPackageFactory implements IKFCFactory {
public KFCFood createFood() {
return new Chicken();
}
public KFCDrink createDrink() {
return new Coffee();
}
}
public class Client {
public static void main(String[] args) {
//经济型套餐
IFactory factory = new CheapPackageFactory();
KFCFood food1 = factory.createFood();
KFCDrink drink1 = factory.createDrink();
food1.show();
drink1.show();
}
}
抽象工厂模式可用于以下情形:
- 同一个产品族的产品在一起使用,而且它们之间是相互依赖的,不可分离
- 只希望提供一组对象而不显示它们的实现过程,只显示它们的接口
- 系统不依赖于某些具体的产品类
来源:oschina
链接:https://my.oschina.net/itblog/blog/3325131