对工厂方法模式的一些思考(java语法表示)
同为创造型
设计模式的简单工厂模式
可以理解为对new关键字的代替。
本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它。那我们为什么要用简单工厂模式代替new呢?就像我们使用Getter Setter代替直接读写字段一样,说白了就是加上一个间接层,以缓冲处理流程的变化(比如获取字段的时候,为其加上100再返回,写在Getter里就不需要散弹式修改)。
相比起来工厂方法模式无疑复杂了很多。引用一句维基百科上对其用途的解释:
Deal with the problem of creating objects without having to specify the exact class of the object that will be created
也就是说用在不想直接引用精确类型来创建对象
的时候。等等,不引用精确类型那不就是多态吗,那我们直接用
AInterface a;
//TODO: 对a依赖注入
a.work();
AInterface b;
//TODO: 对b进行不同精确类型的依赖注入
b.work();
这样的形式不就行了吗?
如果这样就能解决问题,当然可以这样用,毕竟重构只在必要的时候去做。但是对a进行依赖注入的工作肯定不会自动完成,为了解决这个问题出现了一大批依赖注入框架。如果你不想用笨重的框架,那你就得自己去创建a的实例,然后理所当然的你就必须知道a的精确类型,毕竟你不能直接new一个接口,至少在java里是这样。所以你有了这样的代码:
AInterface a;
a = new AInterfaceImpl();
a.work();
AInterface b;
b = new BInterfaceImpl();
b.work();
事实上,恶心的工作不会消失不见,顶多可以把恶心的工作延迟完成,不然我们的程序不可能跑得动。在上面的需求里,你不能永远忽视a的精确类型,就算用依赖注入框架也是一样的,在程序的某个地方,你必须给它一个明确的类型。但是,程序员的美德是,复杂的工作,永远要推迟到后面去实现,至少在上面的代码里,我想要隐藏精确类型,比如像这样:
Factory factory;
//TODO: 对factory依赖注入
//看,用起来很简单对吧
AInterface a;
a = factory.getIt();
a.work();
//TODO: 对factory进行不同的依赖注入
//用多态的特性做不同的工作
AInterface b;
b = factory.getIt();
b.work();
好吧,我们解决了一个问题,然后引入了另一个问题。现在我们必须关心Factory的精确类型了。我们不停地把垃圾扔给别人,以保持自己的干净。
对于不停传递垃圾这种行为我已经累了,不想写了,但是工厂方法模式当然还没有结束,有空再写吧
对工厂方法模式的一些思考(java语法表示)的更多相关文章
- 工厂方法模式的一些思考(java语法表示)
同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就 ...
- java设计模式(二)---工厂方法模式
2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...
- java之设计模式工厂三兄弟之工厂方法模式
[学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- JAVA设计模式--工厂方法模式
工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...
- Java设计模式3:工厂方法模式
工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- JAVA设计模式之工厂方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
随机推荐
- Restful认识和 IK分词器的使用
什么是Restful风格 Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作. 使用Restful的好处: 透 ...
- jzoj5805
#include<bits/stdc++.h> using namespace std; int x,n,pp,ct[10000]; long double f[210][(1<&l ...
- 转载:在spring中嵌入activemq
转载:http://www.dev26.com/blog/article/137 web开发站中的邮件发送使用了activemq我这是从网上找的进行了一些修改,记录下来,为了避免发送邮件时程序对用户操 ...
- IntelliJ IDEA优秀插件(编程通用)
一.IntelliJ IDEA开发 最近大部分开发IDE工具都切换到了,所以也花了点心思去找了相关的插件.这里整理的适合各种语言开发的通用插件,也排除掉IntelliJ IDEA自带的常用插件了(有些 ...
- 【Hight Performance Javascript】——脚本加载和运行
脚本加载和运行 当浏览器遇到一个<script>标签时,无法预知javascript是否在<p>标签中添加内容.因此,浏览器停下来,运行javascript代码,然后继续解析. ...
- 【wireshark】抓包和文件格式支持
1. 抓包 捕获从网络适配器提取包,并将其保存到硬盘上. 访问底层网络适配器需要提升的权限,因此和底层网卡抓包的功能被封装在dumpcap中,这是Wireshark中唯一需要特权执行的程序,代码的其他 ...
- 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- 【bzoj3489】 A simple rmq problem k-d树
由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...
- javascript保存excel
function saveToExcel() { var cind=1; try { var xls = new ActiveXObject ("Excel.Application" ...
- (转)Jupyter notebook入门教程(上,下)
https://blog.csdn.net/red_stone1/article/details/72858962------上 https://blog.csdn.net/red_stone1/ar ...