工厂方法模式

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

首先,我们先介绍简单工厂模式。

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

下面,我将由具体的实例一步步的引出为什么要用工厂方法模式,以及工厂方法模式解决了哪些问题。

想象一下,如果让我们自己实现一个简单的像 log4j 那样的日志框架该怎么设计呢?

 

 我们可能这样做,但这样做的坏处是什么?

public class Log1 {public static void debug(String message){System.out.println(message);}
}
public class Client2 {Logger logger= LoggerFactory.getLogger(Config.LOG_TYPE);public void begin(){logger.debug("log");}
}

这样做的坏处就是

有一天,我们想要把我们的应用改为一个更好日志框架,我们蒙了,为什么呢?

因为像

Log1 log1=new Log1();

这样的代码在每个类里面都有一个,我们要每一个都要更改,麻烦不说,还易出错。

于是我们做了如下改进。简单工厂模式登场了。

public class LoggerFactory {public static Logger getLogger(String logType){if("Log1".equals(logType)){return new Log1();}if("Log2".equals(logType)){return new Log2();}return null;}
}
public class Client2 {Logger logger= LoggerFactory.getLogger(Config.LOG_TYPE);public void begin(){logger.debug("log");}
}  

这样,我们只需改下配置中的日志类型就可以实现两种日志间的无缝切换,看起来一切完美。

简单工厂模式将日志对象的实例化推迟到工厂中,实现了应用和日志对象的实例化的解耦。

但是,简单工厂模式有什么不足呢?

工厂方法模式又改进了简单工厂模式的哪些缺点呢?

现在,我们又觉得原先的日志框架功能不太好用,我们又想开发一个新的日志框架了。

于是我们又加了一个if else 。如果以后我们又想再加呢?我们还得再写一个if else 。

像下面这样

public class LoggerFactory {public static Logger getLogger(String logType){if("Log1".equals(logType)){return new Log1();}if("Log2".equals(logType)){return new Log2();}if("Log3".equals(logType)){return new Log3();}return null;}
}

我们已经发现问题了,这样做违反了开闭原则。

于是。。。。。。工厂方法模式登场了

于是我们进一步改进我们的框架,采用工厂方法模式。

public class LoggerFactory {private static IFactory iFactory;public static Logger getLogger(){return iFactory.getLogger();}
}
public interface IFactory {Logger getLogger();
}
public class Log1Factory implements IFactory {@Overridepublic Logger getLogger() {return new Log1();}
}

这样,当以后我们再有新的日志框架时

只要这个新的日志框架符合我们的接口定义,实现了Ifactory 接口。我们就只需要为LoggerFactroy 的ifactory 注入这个新的工厂就行了。

注入方式可以是构造方法注入,setter 注入或者让 Spring 帮我们注入。

不错,self4j 就是这么一个日志接口的定义。Log4j2 和Logback 都实现了self4j 的接口,所以我们就可以开开心心的在Log4j2 和Logback 以及以后可能出的任何实现self4j 接口的日志框架之间自由切换了。

当然,他们的实现比我们这个简单的样例要复杂的多。

而且他们注入工厂是自动扫描工程中实现 self4j接口的实现类来实现,所以只要我们引入相关jar 包就行啦。

工厂方法模式应用场景相关推荐

  1. [设计模式]简单工厂和工厂方法模式适用场景

    简单工厂模式 适用场景: 1.工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂. 2.客户端只知道传入工厂类的参数,对于如何创建对象并不关心. 工厂方法模式 适用场 ...

  2. Java设计模式【之】工厂方法模式【场景:制作咖啡】

    Java设计模式[之]工厂方法模式[场景:制作咖啡] 1.工厂方法 1.1.工厂方法模式 1.2.具体需求(生产多种咖啡) 2.代码实现 2.1.代码结构 2.2.咖啡抽象类 2.3.一种咖啡 2.4 ...

  3. android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式

    目录 定义 使用场景 UML 模式1 模式2 模式3 简单工厂模式静态工厂模式 简单实现 Android源码中的工厂方法 总结 优点 缺点 工厂方法模式也是创建型模式. 工厂模式根据抽象程度可以分为三 ...

  4. 工厂方法模式适用场景

    创建对象需要大量重复的代码. 客户端(应用层)不依赖于产品类实例如何被创建.实现等细节. 一个类通过其子类来指定创建哪个对象.

  5. 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.工厂方法模式简介 二.工厂方法模式适用场景 三.工厂方法模式优缺点 四.工厂方法模式代码示例 1.产品抽象类 2.产品实现类 1 3.产品实现类 2 4.抽象工厂类 5.实现工厂类 1 ...

  6. 设计模式(2)工厂方法模式(Factory Method)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...

  7. 设计模式——工厂方法模式(Factory Method)

    工厂方法模式:Factory Method 在我们的日常开发中,很多地方都可以用上工厂方法模式(事实是基础开发中,大部分人从来都不会去考虑使用). 工厂方法模式英文定义: Define an inte ...

  8. 工厂方法模式、抽象工厂模式

    工厂系列 定义: 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 分类: 工厂模式在<Java 与模式>中分为三类:这三种模式从上到下逐 ...

  9. java-抽象工厂模式+工厂方法模式+策略模式简单应用实战(登录场景)

    前言 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  10. 工厂模式(简单工厂模式、工厂方法模式优缺点,使用场景)

    工厂模式,优缺点以及存在的意义 1.简单工厂模式(静态工厂模式) 2.工厂方法模式 工厂模式的本质 实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象统一管理和控制.从而将调用者跟我们的实 ...

最新文章

  1. 金山发布《2006年度信息安全报告》
  2. 成都大学的计算机排名,成都除了成都大学,还有2所985、4所211,含金量很高
  3. 【DIY】最简单粗暴便宜的DIY定时器方法,没有之一
  4. cd短是什么意思_每日命令|pwd、cd
  5. 送给即将春秋招的同学--一名服务端开发工程师的校招面经总结
  6. 从实战到原理,线程池的各类使用场景整合
  7. FreeRTOS内核实现07(完):支持时间片
  8. ideal如何快速导入import_Vue性能优化:如何实现延迟加载和代码拆分?
  9. TrueCrypt的原理
  10. 计算机没有无线网卡驱动程序,win10系统的无线网卡驱动没了的解决方法
  11. css斜线边框,CSS border斜线效果
  12. android sdcard 不存在,安卓手机真机运行时找不到sdcard?
  13. android基本布局-TableLayout_表格布局
  14. 如何低成本减少企业知识流失?天翎知识文档系统+群晖NAS值得一试
  15. 苹果用Android发文,安卓和苹果怎么传文件 安卓和苹果传文件详细教程
  16. Nvidia Jetson Agx Xavier 在Ros中调用GMSL2相机
  17. [CSP-S模拟测试]:壕游戏(费用流)
  18. Revit 浏览器组织
  19. Edittext失去焦点和重新获取焦点事件
  20. angularjs2入门实例(2)

热门文章

  1. 【论文学习:基于EEG/EMG/EOG的多模态人机接口,用于实时控制软机器人手】
  2. Epicor客制化 - 在VS中进行开发
  3. SWUN 1431 - 伊邪那美(Ⅱ)
  4. goolgle支付配置备忘录
  5. 下载测试视频网站分享
  6. Java语言知识大盘点(期末总复习)三
  7. [ProblemSolving]教育网下载速度慢,如何解决?
  8. 设计模式七大原则——单一职责原则
  9. Python实现视频流媒体传输
  10. C++类学习---------step1