设计模式(三) 抽象工厂模式

1. 绕不开的火锅

我运用了工厂方法模式 建设了我的火锅帝国 但是仔细想一想 火锅工厂方法模式还是有点脱离实际

我们从始至终都把火锅当成一个不可分割的整体 但是仔细想想火锅是一个整体吗? 各种配料 各种这些配料的供应商 为了做大做强 我们需要自己的子公司 自己的配料公司 由他们给我提供优质的配料 例如 花椒 辣椒 地沟…不..优质菜油 酱料……..而且还要分地域性的 各地有各地的口味…..有的菜需要用嫩辣椒 有的要用老辣椒 有的用辣椒壳 有的用辣椒籽………你怎么半? ? ?是不是觉得头大😂

如果放大这个细节 会发现 我们以前的模式貌似都不适用了 因为火锅对应着一个产品族:

graph BT; shop[火锅类
1.花椒类
2辣椒类
3菜油类] id[1花椒类]-->shop; id2[2辣椒类]-->shop; id3[3菜油类]-->shop; id5[.....]-->shop;

火锅是由多个产品组成的一个产品 ! ! ! !

所以我们前面的火锅都得忘记掉 ! 完全不适用 !

一个小小的火锅其实一点都不小 ! 他后面有一家花椒工厂 地点在成都 从哪里加工花椒 有江西婺源的采集的油菜花 加工成优质菜油 还有 湖南的辣椒 在长沙保存 运输………一碗小小的火锅聚集了祖国各地的美味啊 都是大自然的馈赠啊 所以我的火锅店运营理念就是 : 我们不生产火锅 , 我们只做大自然的搬运工 ! ! !

好了好了 回过来😂 下面介绍抽象工厂模式

2. 抽象工厂模式

照旧先来个官方点的定义 : 提供一个借口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 他是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂 😂 有点绕 这个源自菜鸟教程

我们的做法就是既然火锅是多个产品组成的 那么我们就抽象出火锅工厂这个接口 用于定义一组相关的产品的获取方法 用不同的具体工厂类实现这个接口

而且生意做大了 店面已经不需要生产火锅了 全部交给工厂就好了 所以店面就是地址不同 进货工厂不同而已

如图:

graph RL; shop[MyStore
private HuoguoAbstractFactory
1.优秀的管理方法]; AbstractFactory{HuoguoAbstractFactory
get花椒 get辣椒 get菜油 get其他}; id[JiangxiFactory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; id1[HuNanFactory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; id2[GuangDongFactory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; id3[.....Factory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; AbstractFactory-->shop;

材料图:材料还有很多……….

graph BT; AbstractFactory{花椒}; id[花椒末]-.实现.->AbstractFactory; id1[花椒籽]-.实现.->AbstractFactory; id2[花椒壳]-.实现.->AbstractFactory; id3[.....]-.实现.->AbstractFactory; AbstractFactory1{辣椒}; id11[辣椒末]-.实现.->AbstractFactory1; id22[辣椒籽]-.实现.->AbstractFactory1; id33[辣椒壳]-.实现.->AbstractFactory1; id44[.....]-.实现.->AbstractFactory1;

组合一下图吧 很复杂 但是思路清晰 大概就这样的结构 铺不开

通过这些具体的工厂获取各种材料

graph BT; shop[MyStore
private HuoguoAbstractFactory
1.优秀的管理方法]; AbstractFactory{HuoguoAbstractFactory
get花椒 get辣椒 get菜油 get其他}; id[JiangxiFactory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; id1[HuNanFactory
get花椒 get辣椒 get菜油 get其他]-.实现.->AbstractFactory; id3[其他实现类]-.实现.->AbstractFactory; AbstractFactory-->shop; dm{花椒}; d1[花椒末]-.实现.->dm; d2[花椒籽]-.实现.->dm; d3[花椒壳]-.实现.->dm; d4[.....]-.实现.->dm; ddm{辣椒}; ddm1[辣椒末]-.实现.->ddm; ddm2[辣椒籽]-.实现.->ddm; ddm3[辣椒壳]-.实现.->ddm; ddm4[.....]-.实现.->ddm; other{其他原料}; dm-->id; ddm-->id; other-->id

这就是抽象工厂模式 它主要是生产一个系列的产品 工厂方法模式 只能生产一个产品

他能对产品族进行很好的解耦合 想想看 如果我开一家武汉店的火锅 然后调查他们的口味 接下来就是积木了 当然如果要扩展接口的话 虽然没人喜欢这么做 因为这是很严重的问题 必须重写全部下面的实现 出现这样的情况 请让你的设计或者产品经理请你来我店里吃火锅吧

3. 总结

抽象工厂方法是针对一个产品族的设计模式 他能很方便的交换一个产品族 实现了很大程度上的分离 和解耦合

但是如果扩展接口的话 会非常麻烦 所以一个良好的设计非常重要

而且抽象工厂模式内部通常会使用工厂模式 或者使用简单工厂模式 或者使用更多的方案 毕竟他是个更大的接口 怎么实现这个模式还得看具体的场景

到这里我的工厂模式就结束了