作为实际java开发经验还不到一年的我,第一次写博客,诚惶诚恐,怕把自己的谬误公之于众,误人子弟,不过转念一想,若是能有同行加以指点评判,将他们的真知灼见描述出来,那这篇文章就算抛转引玉了。

   最近在阅读《Java编程思想》有关接口的最后一小节中,作者提出了工厂设计模式,用来解决---生成实现某个接口的对象。说实话,对设计模式近乎一无所知的我,看到这里会想,这也太简单了,脑子里不假思索的会写出这样一个例子:

 //气
interface Air{
void show();
} //悟空
class WuKong implements Air{
@Override
public void show() {
System.out.println("悟空:龟派气功");
}
} public class Test {
public static void main(String[] args) {
Air wk = new WuKong();
wk.show();
}
}

  联想到书中提到的工厂设计模式,我这时就会想:这个模式的设计目的是什么?在什么情况下用它能发挥模式的作用?怎么写出这个模式,而不纯粹靠背的?

  1.书中的解释看的不太明白,后台在网上找了一个通俗易懂的解释:工厂设计模式是为了将对象的创建与使用进行分离。上面例子中创建了悟空对象,随机就调用了show() ,而这种模式就是在悟空对象创建和使用这两个环节中做文章。思路弄明白了,超级简单。本来流程是:生成对象a-->a.m();演变成生成工厂类b,b中的方法n(),可以生成对象a,然后a.m()。看看代码:

interface Air{
void show();
}
//悟空
class WuKong implements Air{
@Override
public void show() {
System.out.println("悟空:龟派气功");
}
}
//悟空工厂类,目的很单纯,就为了创建悟空对象
class WuKongFactory{
public Air getAir(){
return new WuKong();
}
}
public class Test {
public static void main(String[] args) {
// Air wk = new WuKong();
// wk.show();
/**
* 随着引入工厂类,调用show方法也做了些调整,先创建悟空工厂类对象factory,
* 重点来了,new WuKong()的操作被封装到了getAir()里面。
* 试想这样一种情景:main()方法我们不改动它,可以自己新增修改其他类,
* 在这种情况下:我们可以修改getAir()方法,来return任何包含有show()方法的对象(也就是实现Air接口),
* 从而让下面的代码输出不同的结果。很显然,注释的那两行代码玩不出这种花样。
*/
WuKongFactory factory = new WuKongFactory();
factory.getAir().show(); }
}

  来,我们来验证一下,在main()方法不变的情况下,我们新增一个实现Air接口的八戒类,看看效果:

//悟空工厂类,目的很单纯,就为了创建悟空对象
class WuKongFactory{
public Air getAir(){
//注意:这里不再是new WuKong()
return new BaJie();
}
}
//八戒
class BaJie implements Air{
@Override
public void show() {
System.out.println("八戒:猪猪乾坤屁");
}
}

  这时factory.getAir()创建的是八戒对象,于是产生了不同的结果。还有一点优化:针对WuKongFactory这个getAir()方法,其实是这个模式的核心方法,它就是为了创建你想要解耦的那个对象的实例,可以如书中的例子一样,把它抽离出来,封装成一个接口,想创建悟空或八戒对象时,就实现这个接口,重写方法创建你想要的对象。

interface Factory{
Air getAir();
}
class WuKongFactory implements Factory{
@Override
public Air getAir() {
return new WuKong();
}
}
class BaJieFactory implements Factory{
public Air getAir() {
return new BaJie();
}
}

  

  走笔至此,工厂方法设计模式的理解,我也就只能讲这么多,由于开发经验太单薄,而且我也处于正在学习Java的阶段,所以我没能举出在实际项目中运用这种模式的鲜活案例(有用到这种模式的朋友们希望能分享一下)。不过,这种模式的理解之后,还是比较简单的,绕的弯也就那么一道而已。同时,我在继续看这本书时,以后也会多写博客,整理一下心得,与大家共享。

  

java接口工厂模式理解的更多相关文章

  1. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  2. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

  3. 一张图搞定Java设计模式——工厂模式! 就问你要不要学!

    小编今天分享的内容是Java设计模式之工厂模式. 收藏之前,务必点个赞,这对小编能否在头条继续给大家分享Java的知识很重要,谢谢!文末有投票,你想了解Java的哪一部分内容,请反馈给我. 获取学习资 ...

  4. Java抽象工厂模式

    Java抽象工厂模式 基本定义 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 ...

  5. Java的工厂模式(一)

    Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...

  6. Java 静态工厂模式的使用

    多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...

  7. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  8. 07@Pattern_Note_LabVIEW工厂模式理解

    前言 折腾了一天,基本上搞清楚了简单工厂.工厂模式 理解 无论是简单工厂还是工厂模式,都有一个特点,即工厂加工的方式是不变的,产品的类型可以不断扩展:如果加工方式也会变化,修改工厂模式的加工方式会导致 ...

  9. JAVA简单工厂模式(从现实生活角度理解代码原理)

    简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品.也可以称他为静态工厂设计模式,类似于之前提到过静态代理设计模式, ...

随机推荐

  1. VsCode编辑器那些事

    1.怎么改成中文的? 按快捷键“Ctrl+Shift+P” 在框下点击“configur Display language" 会跳转至商店,选择插件下载“Chinese (Simplifie ...

  2. [转载] 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  3. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  4. drf 简介以及部分源码分析

    目录 复习 drf框架 全称:django-rest framework 知识点 接口 restful接口规范 基于restful规范的原生Django接口 主路由:url.py api组件的子路由: ...

  5. hdu2642二维树状数组,单点修改+区间查询

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2642/ 代码如下: #include<bits/stdc++.h> using namespace ...

  6. Servlet(二)----注解配置

    ##  Servlet3.0 *  好处: *  支持注解配置.可以不需要web.xml了. *  步骤: 1.创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml 2. ...

  7. 【开源】使用Angular9和TypeScript开发RPG游戏(补充了Buffer技能)

    RPG系统构造 通过对于斗罗大陆小说的游戏化过程,熟悉Angular的结构以及使用TypeScript的面向对象开发方法. Github项目源代码地址 RPG系统构造 ver0.02 2020/03/ ...

  8. ​知识图谱与机器学习 | KG入门 -- Part1 Data Fabric

    介绍 如果你在网上搜索机器学习,你会找到大约20500万个结果.确实是这样,但是要找到适合每个用例的描述或定义并不容易,然而会有一些非常棒的描述或定义.在这里,我将提出机器学习的另一种定义,重点介绍一 ...

  9. Java 注解 So Easy!!!

    Java注解 Annotations, a form of metadata, provide data about a program that is not part of the program ...

  10. YII2自动初始化脚本

    #!/usr/bin/expect spawn ./init expect "Which environment do you want the application to be init ...