前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解 设计模式之工厂模式

深入理解 设计模式之工厂模式

原创
作者头像
村子里的设计师
修改2023-03-26 17:47:21
2950
修改2023-03-26 17:47:21
举报
文章被收录于专栏:程序设计a

总结

简言之,客户需要产品时找工厂要,而不是客户自己要产品。前者客户只需要 "向工厂申请产品"的接口,后者客户需要"申请产品1", "申请产品2"等多个接口。

工厂模式体现了程序设计中的:

  • 依赖倒转原则 (抽象依赖抽象,在抽象工厂模式中有体现)
  • 最小知识原则? (客户只和工厂打交道)

不知名原则:

  • 以代码量换取扩展性 (俺自己起的不行嘛.....)

思考

  • 工厂模式想解决的问题:有较多产品时,与其让客户接触杂乱的产品接口,不如接触一个工厂接口,通过工厂访问产品。
  • 工厂模式面对的问题:随着产品的增加,工厂的负担加重。如果工厂过于"全能",其生产产品的方法会冗长;如果工厂过于"术业有专攻",工厂的数量将接近于产品的数量,代码二倍增长。
  • 站在客户的角度,工厂模式是简约的;站在开发者的角度,工厂模式是繁琐的。相比于简单工厂模式,工厂方法模式扩展性更强,是以代码量换取扩展性。
  • 感觉这是面向过程思考出的结果,如果只是面向对象,很难将对象抽象出工厂模式。

简单工厂模式

要素:具体工厂类,抽象产品类,具体产品1类,具体产品2类。

  • 具体产品1类:比如 福田车;
  • 具体产品2类:比如 广汽车;
  • 抽象产品类:比如 车,是上两个的父类。提供 刹车 等虚函数;
  • 抽象工厂类:比如 汽车工厂,提供 生产车辆 的方法,根据传入参数,决定生产的产品类型。

客户使用时需要:

  1. 创建 汽车工厂对象
  2. 汽车工厂对象 调用 生产车辆 的方法 (传入参数为 福田时,汽车工厂.生产车辆("福田"));
  3. 得到 福田车对象

工厂方法模式

在"简单工厂模式"中,汽车工厂类 过于抽象,随着产品种类的增加,汽车工厂类中的生产车辆方法将变得十分臃肿。如果有 福田车工厂类广汽车工厂类更好,这样一个工厂生产一种汽车,增加一种汽车就增加对应工厂生产它。于是改进为:

  • (具体产品类) 福田车类;
  • (具体产品类) 广汽车类;
  • (抽象产品类) 车类;
  • (抽象工厂类) 汽车工厂类;
  • (具体工厂类) 福田车工厂类;
  • (具体工厂类) 广汽车工厂类;

客户使用时需要:

  1. 根据传入参数决定将 汽车工厂类对象初始化为福田车工厂还是广汽车工厂
  2. 福田车工厂对象 调用 生产车辆方法
  3. 得到 福田车对象

抽象工厂模式

在"工厂方法模式"中,每增加一种具体产品,就增加一种具体工厂,开发成本大。但是抽象工厂模式不是为了解决这个问题滴(我是这么理解的,欢迎纠错)。比如 我想买 巧克力饼干,希望有一个巧克力饼干工厂,这个工厂同时依赖巧克力类饼干类(前两种模式中工厂只依赖一种产品类,此处依赖多种产品类),提供生产巧克力生产饼干的接口。

客户使用时需要:

  1. 初始化 巧克力饼干工厂对象
  2. 该对象调用生产巧克力生产饼干的接口;
  3. 得到巧克力对象饼干对象
  4. (同时吃巧克力和饼干得到巧克力饼干);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
  • 思考
  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档