在工厂方法模式的基础上,新增加了产品族的概念。将原来的一对一关系,变成了一对多,这个一对多和简单工厂模式的不同,简单工厂模式的一对多,指的是一个工厂类对应多个创建的对象,这里的一对多,是一个抽象工厂,对应的多个产品族的子工厂,每个子工厂中对应着多个系列的具体产品实现。用户在使用的时候,就可以随意组合各种产品,程序也变的更灵活。
上篇已经说到:去KFC吃薯条。
本篇演示:去吃KFC的薯条,喝Dicos的雪碧
//首先,产品接口 吃喝都有
public interface IChips {
void eat();
}
public interface IDrink {
void drink();
}
//具体产品
//吃的
public class DIcosChip implements IChips {
@Override
public void eat() {
System.out.println("吃到了麦当劳的薯条");
}
}
public class KFCChip implements IChips {
@Override
public void eat() {
System.out.println("吃到了KFC的薯条");
}
}
//喝的
public class KFCCola implements IDrink {
@Override
public void drink() {
System.out.println("喝到了肯德基的可乐");
}
}
public class DicosSprite implements IDrink {
@Override
public void drink() {
System.out.println("喝到了麦当劳的雪碧");
}
}
//抽象工厂
public interface IStore {
//不仅可以吃到薯条,还能喝到汽水哦,后续还有瓜子,花生米哦
IChips getChips();
IDrink getDrink();
}
//具体工厂
public class KFC implements IStore {
@Override
public IChips getChips() {
System.out.println("肯德基生产的薯条");
//具体生产对象在这里
return new KFCChip();
}
@Override
public IDrink getDrink() {
System.out.println("肯德基生产的可乐");
return new KFCCola();
}
}
public class Dicos implements IStore {
@Override
public IChips getChips() {
System.out.println("德克士生产了薯条!");
//在这里生产薯条,你也可以产出其他家的薯条,用户是不知道滴。有种狸猫换太子的感觉
return new DIcosChip();
}
@Override
public IDrink getDrink() {
System.out.println("麦当劳生产的雪碧");
return new DicosSprite();
}
}
//测试类
public class AbstractFactoryTest {
public static void main(String[] args) {
IStore kfc = new KFC();
IChips chips = kfc.getChips();
chips.eat();
new Dicos().getDrink().drink();
}
}
//结果:
肯德基生产的薯条
吃到了KFC的薯条
麦当劳生产的雪碧
喝到了麦当劳的雪碧
简单工厂模式,工厂方法模式,抽象工厂模式都叫工厂模式,实际运用中,没有必要严格区分哪种模式,而应该考虑是否达到了解耦的目的。