转载请注明出处:http://blog.csdn.NET/singwhatiwanna/article/details/17428923
说明:博主虚心接受大家的抨击,批评,指正
我一直想介绍下工厂模式,我曾经搞过J2EE,用的是轻量级SSH框架,其中spring有IOC概念,可以称之为控制反转或者依赖注入,在系统开发中,IOC可以很好的替代工厂模式。若干年前,我只用过IOC,并没有用过工厂模式,但是工厂模式这个概念却是给我留下了深深的印象,毕竟,它是我所听说过第一个设计模式,我想它应该是很强大的吧。但是,事情不是我想的那个样子的,在我之前所参与的项目(Android)中几乎没有工厂模式的身影,仅仅是有一个项目采用了简单工厂模式去管理所有的业务管理器。后来,我开始仔细研究工厂模式,发现工厂模式是让我失望的。工厂模式有三种实现方式:简单工厂、工厂方法和抽象广场,除了简单工厂我还发现了一点使用价值外,后两者我基本没发现有啥可使用价值。也许我的理解还不够透彻,但是目前网上存在的大部分介绍工厂模式的文章都体现了一点:华而不实,难以实际应用。一篇文章不能清晰的介绍一个概念,不能清晰的说明为什么要使用这个东西以及如何使用这个东西,那么这篇文章不算好文章的。我目前所看到的关于工厂模式的介绍都是不充分的,包括我写的这篇,期待真正的好文章出现。下面将介绍简单工厂模式以及一个实际项目中使用的例子,后面我将会简单阐述我的观点:为什么工厂模式是华而不实的。
直接目的:避免在代码中出现大量的new关键字
根本目的:将对象的创建统一起来便于维护和整体把控
这一点可以理解,加入你在项目中new了某个对象100次,一年后由于业务逻辑变更,构造方法多了一个参数,你会怎么办?你应该会这么做:找到这100个对象new的地方,用新的构造方法来创建对象,你重复劳动了100次,假如采用工厂模式,你只用改一次:把创建工厂给改一下就好了。这就是工厂模式最简单最直接的好处。
下面是最常见的一个示范,其实它的原理就是面向对象中的多态+接口编程,虽然返回的都是Car类型,但是drive的时候会调用真正的实例中的对应方法。按照抽象类和接口的意义归属,Car应该被定义成抽象类,因为Benz、Bmw和Car的关系是继承关系,而接口表示的一组行为。但是,为什么这里还要定义成接口,是因为Java和.NET不支持多继承,如果继承了Car,就无法继承其他类,有时候业务需要必须继承其他类,这个时候代码就不能用了。当然,C++中支持多继承,因此可以在C++中使用抽象类,另外C++没接口的概念,但你可以模拟接口。这里只介绍简单工厂模式,至于剩下两种工厂模式,我觉得更没有使用价值。
上述代码是没啥用的,看一个实际使用的例子。下面这个工厂模式的意义在于能够统一管理所有的业务管理器,仅此而已。
优点:将对象的创建统一起来便于维护和整体把控,对扩展开放,对修改封闭
缺点:耦合性提高,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。
从工厂模式的示例可以看出:工厂模式需要类实现它的接口并且在业务内部存在明显的继承关系,比如汽车和奔驰宝马的关系。而继承关系往往存在于模型之间,业务之间很难存在继承关系,因此如果业务内部或者业务之间没有这种显式的继承关系该咋办?就算业务内部有继承关系,各个业务交给你统一管理,这样就会提高代码的耦合性,当创建逻辑复杂的时候,工厂方法就很复杂,容易产生干扰。
可以通过高度层次化和模块化来提高系统的开闭性,而不必生硬地去套用工厂模式。
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数