程序员的知识教程库

网站首页 > 教程分享 正文

论抽象工厂模式(抽象工厂模式包含的角色)

henian88 2024-10-18 05:58:09 教程分享 2 ℃ 0 评论

应用案例

  • 用户可以点不同口味的pizza,加上地区,例如北京的奶酪pizza、北京的胡椒pizza 或者是伦敦的奶酪pizza、伦敦的胡椒pizza

设计思想:pizza有两个属性:地区,口味;同时定义完两个属性就可以展示一个完整的pizza

基于工厂模式修改为抽象工厂模式

  • 1) 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇
  • 此设计方案,作者本人觉的欠妥,并未真正利用到抽象工厂模式

抽象工厂模式:将零件组装成产品

  • 抽象工厂的工作是将“抽象零件”组装成“抽象产品”
  • 我们并不关心零件的具体实现,而是关心接口(api)。我们仅使用接口(api)将零件组装成为产品
  • 设计思路:利用面向对象的设计思想结合抽象工厂模式,将对象的每一个属性看成一个零件,先构成抽象产品,再创建具体产品

produce是最后组装出来的产品

  • 可能会有人说为什么一定要把一个实体类的属性拆分开来再建工厂这样会很麻烦
  • 这只是基于案例改编而来的抽象工厂模式,试图思考一下,更改一下需求,如果最后的产品不是pizza,而是一个全家桶,不拆分属性,将鸡腿,汉堡,可乐视为零件,那么就能发挥抽象工厂真正的作用

特点:增加工厂(MainFactory)容易,但是增加零件(属性工厂,TasteFactory)修改过多

  • 当新增一个零件时,势必会增加造该零件的工厂,所以不易频繁的增删零件

为了便于理解,修改了类的布局

比较:

  • 当增加另一种产品时(比如:汉堡)
  • 第一个设计方法就很难再进行拓展
  • 而第二个,可视为多增加一个零件工厂,相对而言修改较少
  • 当增加一个属性(比如:形状:圆形,方形)
  • 第一个设计,就要在此基础上再增加一层形状的工厂,以此下去继承的层级会逐渐增高
  • 第二种,只是横向拓展,层级不变

综上所述,作者认为第二种抽象工厂模式更加符合,而且易拓展。第二种

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表