工厂方法模式的两个极端

简介: 概念:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

什么是工厂方法:


   概念:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

   定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

   用处:为了解决下图简单工厂类中使用了判断,如果修改运算类那么就需要修改对应的简单工厂类,违背了开闭原则,进而提出了工厂方法模式(下面只用UML图来解释两个极端至于对应的代码就不做过多解释,图中的关系对应的代码问题请访问:http://blog.csdn.net/shiyiqijialimin/article/details/48128785


20151004143630399.jpg


一对一的极端


20151004143713930.jpg


   上图用到了工厂方法很好的解决了简单工厂中使用判断,违背开闭原则的问题。

   这种纯一对一的极端:优点是一个子工厂对应一个算法子类让我们看起来更加清晰;不足是:如果算法很多的时候,需要产生很多的子工厂。


一对多的极端


20151004143744518.jpg


   上图很显然也解决了简单工厂类中使用判断,违背开闭原则的问题。但是这里子类中也还是有判断的啊?其实这里是将左边三个类看成了一个整体,如果这个工厂不合适,那么就直接添加额外的子工厂来单独对应一个pizza子类。

   这种一对多的极端:优点是将一些可以封装的pizza子类放到了一个子工厂里,省去了子工厂的创建;不足是:如果需要修改其中子工厂的类就又会违背开闭原则。


两极端一起运用:


   一对一的工厂方法图是大话设计模式上介绍的,而一对多的图是Head First设计模式上介绍的,两者优势互补,合并到一起运用就非常方便了。

   用制作pizza的例子来说明的话就是:对于一对多的工厂不产生修改问题,假设这的多个pizza子类是招牌菜,如果增加新菜,那么就产生一个子工厂对应这一个pizza子类,如下图


20151004143908432.jpg


感受:


   在学习设计模式的时候,应该从不同的角度去理解它,就好比head first最后讲的复合模式一样,在什么样的环境中用这个模式合适,如何再进行改造就会更好,但是改造的前提还得是我们的六大原则,让我们用好设计模式这个巨人吧。

相关文章
|
关系型数据库 MySQL Linux
linux环境搭建mysql5.7总结
linux环境搭建mysql5.7总结
135 0
|
存储 传感器 缓存
轻量级的嵌入式模块化软件架构
轻量级的嵌入式模块化软件架构
306 1
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
107 0
|
自然语言处理 API 数据安全/隐私保护
通过阿里云Milvus和通义千问快速构建基于专属知识库的问答系统
本文展示了如何使用阿里云向量检索 Milvus 版和灵积(Dashscope)提供的通用千问大模型能力,快速构建一个基于专属知识库的问答系统。在示例中,我们通过接入灵积的通义千问 API 及文本嵌入(Embedding)API 来实现 LLM 大模型的相关功能。
通过阿里云Milvus和通义千问快速构建基于专属知识库的问答系统
|
XML JSON 前端开发
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
561 1
SCS模型(径流曲线法)概述
SCS模型(径流曲线法)概述
1109 0
|
数据可视化 前端开发 JavaScript
前端数据可视化的工具和库
前端数据可视化的工具和库
588 0
|
JavaScript Ubuntu Shell
成功解决FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\niu\\AppData\\Local\\Temp\\p
成功解决FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\niu\\AppData\\Local\\Temp\\p
成功解决FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\niu\\AppData\\Local\\Temp\\p
|
弹性计算 JSON 安全
阿里云自动化添加安全组
每次去阿里云控制台 将自己的外网IP添加为白名单操作过于繁琐,一切可以自动化的事情应该要自动化,所以我们需要一个 自动将本机外网IP添加为安全组规则的脚本。
2247 0
阿里云自动化添加安全组