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

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

1. 绕不开的火锅

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

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

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

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

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

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

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

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

2. 抽象工厂模式

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

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

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

如图:

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

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

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

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

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

posted @ 2019-05-13 23:21  Tamako666  阅读(126)  评论(0编辑  收藏  举报