抽象工厂模式

在工厂方法模式的基础上,新增加了产品族的概念。将原来的一对一关系,变成了一对多,这个一对多和简单工厂模式的不同,简单工厂模式的一对多,指的是一个工厂类对应多个创建的对象,这里的一对多,是一个抽象工厂,对应的多个产品族的子工厂,每个子工厂中对应着多个系列的具体产品实现。用户在使用的时候,就可以随意组合各种产品,程序也变的更灵活。

抽象工厂模式_第1张图片
抽象工厂模式类图

上篇已经说到:去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的薯条
麦当劳生产的雪碧
喝到了麦当劳的雪碧

简单工厂模式,工厂方法模式,抽象工厂模式都叫工厂模式,实际运用中,没有必要严格区分哪种模式,而应该考虑是否达到了解耦的目的。

你可能感兴趣的:(抽象工厂模式)