工厂模式——猫粮公司的演进 (4)

“哈哈哈哈哈哈,学习有三种境界,第一种:看山是山,看水是水;第二种:看山不是山,看水不是水;第三种:看山依然山,看水依然水。你现在就处于第一种向第二种过度的阶段”,陀螺打趣道。

“我们从头捋一遍我们系统升级的过程,帮助你理解。”

总结

“刚开始我们公司只生产一种产品——鱼香猫粮,这时你直接针对该产品创建类FishCatFood进行业务逻辑编写即可,不需要进行任何优化。”

“后来公司相继生产了其他两种产品,鉴于每种产品产品的相关性,你创建了CatFood抽象类,之后生产的每种产品都需要继承这个类,然后在order()方法中根据用户传入的口味制作相应的产品。但是随着公司的发展,产品可能会一改再改(急剧增加或下架),order()方法不再满足开闭原则,因此我们将创建对象的代码抽离到SimpleCatFoodFactory中进行统一管理,这就是简单工厂。”

简单工厂类图

“后来公司相继在其他省份创建了子公司,每个子公司都有自己的产品,为了避免SimpleCatFoodFactory成为万能工厂,我们为每个分公司创建了独立的简单工厂,按照我们的要求来创建产品对象。”

“我们并不想让子公司能够修改order()的中的逻辑,因此我们试图创建一个‘框架’,强制让子公司使用我们的下单逻辑,同时又保证子公司自由创建产品的灵活性。于是我们在PaoMaChangV4抽象类中使用了抽象的create()方法,我们将实现create()的行为延迟到子类中,父类中制定了基本框架。这一步使得order()不依赖于具体类,换句话说,这就是解耦。当order()方法调用create()方法是,PaoMaChangV4的子类(子公司对象)将负责创建真正的产品。这就是工厂方法模式。”

“最后我们想确保对每个子公司每个产品原料的控制,定义了原料族。这里有一个隐含的假设,每个产品所使用的原料都是相同的,区别是生产方式不同。”

原料家族

“我们创建了原料工厂CatFoodIngredientAbstractFactory接口,该接口定义了创建所有原料的接口,再看一下代码。”

工厂模式——猫粮公司的演进

"接下来我们为每个分公司创建了实现了CatFoodIngredientAbstractFactory接口的子类来实现每一个创建方法。为了更恰当地解释抽象工厂模式,我们又稍微改造了一下猫粮类,得到了CatFoodV2,所有的具体产品依然继承自CatFoodV2,不同的每个产品都需要从构造器中得到一个原料工厂,注入到对象中的catFoodIngredientFactory变量,CatFoodV2中的make()方法会使用到该工厂创建的原料。"

“最后总结一下抽象工厂模式的使用场景,当你需要使用原料家族来创建想要制造的产品的时候,你就可以考虑使用抽象工厂模式了。”

我是蝉沐风,一个让你沉迷于技术的讲述者,欢迎大家留言!

工厂模式——猫粮公司的演进

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfjgp.html