对工厂方法模式的一些思考(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 ...
随机推荐
- ZZNU 2055(基姆拉尔森计算公式)
题目链接 题意: 比如今天是2017年8月16日,星期三.下一个也是星期三的8月16日发生在2023年. 现在是日期是yyyy-mm-dd,我们希望你求出薛定谔会跳跃到那一年. 题解: emmmm.. ...
- SAX,功能强大的 API
https://www.ibm.com/developerworks/cn/xml/x-saxapi/ SAX,功能强大的 API 在摘自 XML by Example 的本篇预览中比较了 DOM 和 ...
- Dockerfile指令详解下
VOLUME 定义匿名卷 VOLUME指令的格式为: VOLUME [,...] VOLUME 之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库 ...
- Python中线程与互斥锁
了解之前我们先了解一下什么是多任务? 概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务; 并行: 真的多任务, 通过电脑的核数来确定 并发: 假的多任务 ...
- centos6.5 yum安装lamp
准备篇: 1.清空防火墙 iptables -F 或者关闭防火墙 /etc/init.d/iptables stop,如果要防火墙开机不要启动 chkconfig iptables off 2.关闭S ...
- Unity色子的投掷与点数的获得(详解)
前几天需要一个色子的投掷并且获得朝上点数的Unity脚本,在网上找了很多,都是一个模子刻出来的. 对于2018版的我来说,网上找的都是很早就弃用了的老版本. 好不容易能运行了,结果并不理想,于是又突发 ...
- centos7修改默认运行级别的变化
在学习centos7,视频教学中使用的的centos6,查看权限文件命令为 cat /etc/inittab/ 但是在centos7中输入以下命令会出现这种情况 这个已经不用了,现在修改权限的命令修改 ...
- 安装SQL Server 2016出错提示:需要安装oracle JRE7 更新 51(64位)或更高版本完美解决办法
错误提示原因:安装时检测出电脑没有安装JDK,而且是版本7(其他版本不行) 解决方法:先进下面这个网站安装JDK,安装好后配置环境变量,然后重新安装SQL Server 2016即可 http://w ...
- 【LeetCode】414. 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- 一个用JS数组实现的队列
一个用JS数组实现的队列 /*一个用数组实现的队列*/ function Queue(){ this.dataStore = [];//存放队列的数组,初始化为空 this.enqueue = enq ...