同为创造型设计模式的简单工厂模式可以理解为对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语法表示)的更多相关文章

  1. 对工厂方法模式的一些思考(java语法表示)

    同为创造型设计模式的简单工厂模式可以理解为对new关键字的代替. 本着重复三次即重构的原则,如果一个对象在不同的地方被new了两次以上,那就可以考虑使用它.那我们为什么要用简单工厂模式代替new呢?就 ...

  2. java设计模式(二)---工厂方法模式

    2普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 2.1创建接口 /** * 发送接口 * Created by mrf on 2016/2/25. */ public ...

  3. java之设计模式工厂三兄弟之工厂方法模式

    [学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...

  4. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

  5. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  6. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

  7. Java设计模式3:工厂方法模式

    工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...

  8. java 23 - 1 设计模式之工厂方法模式

    转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

  9. JAVA设计模式之工厂方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

随机推荐

  1. 【Python】Non-ASCII character '\xe6' 错误解决方法

    刚刚在写Python程序的时候遇到了一个问题,无论是在程序中什么地方出现中文字符,都会出现如下错误 SyntaxError: Non-ASCII character '\xe6' 网上查阅了一下这应该 ...

  2. Java并发Fork-Join框架原理解析

    1.什么是Foirk/Join框架 Fork/Join框架是Java7提供用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 2.什么是并行流与顺 ...

  3. 二:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  4. MVC页面静态化

    MVC 页面静态化   最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...

  5. 设计模式的征途—21.迭代器(Iterator)模式

    我们都用过电视机遥控器,通过它我们可以进行开机.关机.换台.改变音量等操作.我们可以将电视机看做一个存储电视频道的集合对象,通过遥控器可以对电视机中的频道集合进行操作,例如返回上一个频道.跳转到下一个 ...

  6. tornado超时机制

    1.https://blog.lzhaohao.info/archive/build-a-comet-application-using-tornado-and-nginx/ 2.http://qin ...

  7. 准备冲锋 golang入坑系列

    史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意. 所以换成史前摘要,反正是一个意思. 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在这里.放到博客园的目的是为了方便 ...

  8. Spring集成Quartz完成定时任务

    在JavaEE系统中,我们经常会用到定时任务,比如每天晚上凌晨之后跑批处理或者是每天某个时刻群发消息等等. 我们可以使用java.util.Timer结合java.util.TimerTask来去完成 ...

  9. bootstrap的模态简单案例

    使用时需添加bootstrap的引用,否则实现不出来效果 <!DOCTYPE html> <html><head>    <meta name="v ...

  10. 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...