定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法模式 基本代码

  1. interface IProduct {
  2. public void productMethod();
  3. }
  4. class Product implements IProduct {
  5. public void productMethod() {
  6. System.out.println("产品");
  7. }
  8. }
  9. interface IFactory {
  10. public IProduct createProduct();
  11. }
  12. class Factory implements IFactory {
  13. public IProduct createProduct() {
  14. return new Product();
  15. }
  16. }
  17. public class Client {
  18. public static void main(String[] args) {
  19. IFactory factory = new Factory();
  20. IProduct prodect = factory.createProduct();
  21. prodect.productMethod();
  22. }
  23. }

 

   业务场景

   工厂模式是一个用于实例化对象的模式,是用工厂方法代替new操作的一种方式。工厂模式在Java项目中到处都是,因为工厂模式就相当于创建实例对象的new,如在我们的系统中经常需要记日志,如果创建logger实例时所做的初始化工作可能是很长一段代码,可能要初始化、赋值、查询数据等等,则会导致代码臃肿而难看

  1. private static Logger logger = LoggerFactory.getLogger(MyBusinessRPC.class);
  2. logger.error("数据查询失败,table" + ...);
  3. //源码分析
  4. public static Logger getLogger(String name) {
  5. ILoggerFactory iLoggerFactory = getILoggerFactory();
  6. return iLoggerFactory.getLogger(name);
  7. }
  8. //源码分析
  9. public static ILoggerFactory getILoggerFactory() {
  10. if (INITIALIZATION_STATE == UNINITIALIZED) {
  11. INITIALIZATION_STATE = ONGOING_INITIALIZATION;
  12. performInitialization();
  13. }
  14. switch (INITIALIZATION_STATE) {
  15. case SUCCESSFUL_INITIALIZATION:
  16. return StaticLoggerBinder.getSingleton().getLoggerFactory();
  17. case NOP_FALLBACK_INITIALIZATION:
  18. return NOP_FALLBACK_FACTORY;
  19. case FAILED_INITIALIZATION:
  20. throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);
  21. case ONGOING_INITIALIZATION:
  22. // support re-entrant behavior.
  23. // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106
  24. return TEMP_FACTORY;
  25. }
  26. throw new IllegalStateException("Unreachable code");
  27. }

  

  业务场景

  比如我们要从集合(库存中)中取出一个数据,或者一些调度算法,我们有很策略实现(先进先出,最少使用,最近最少使用,最近最少使用  等)

  1. public class ArithmeticFactory {
  2. public Arithmetic createFiFoArithmetic(){
  3. Arithmetic arithmetic = new FIFOStockArithmetic();
  4. return arithmetic;
  5. }
  6. public Arithmetic createNoUseArithmetic(){
  7. Arithmetic arithmetic = new NoUseStockArithmetic();
  8. return arithmetic;
  9. }
  10. }
  11.  
  12. public interface Arithmetic {
  13. public void invoke();
  14. }
  15.  
  16. public class FIFOStockArithmetic implements Arithmetic {
  17. @Override
  18. public void invoke() {
  19. System.out.println("使用了先进先出算法!");
             //具体算法的业务逻辑
  20. }
  21. }
  22.  
  23. public class NoUseStockArithmetic implements Arithmetic {
  24. @Override
  25. public void invoke() {
  26. System.out.println("使用了最少使用算法!");
              //具体算法的业务逻辑
  27. }
  28. }

  

  测试 结果

  1. public class FactoryTest {
  2. public static void main(String args[]){
  3. ArithmeticFactory arithmeticFactory = new ArithmeticFactory();
  4. Arithmetic fiFoArithmetic = arithmeticFactory.createFiFoArithmetic();
  5. Arithmetic noUserarithmetic = arithmeticFactory.createNoUseArithmetic();
  6. fiFoArithmetic.invoke();
  7. noUserarithmetic.invoke();
  8. }
  9. }

  

  业务场景

  spring 和 mybatis 的sqlSessonFactory

  1. <!-- 配置集成Mybatis -->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="configLocation" value="classpath:/config/SQLMapConfig.xml" />
  5. <property name="mapperLocations" value="classpath*:com/*/*/**/infra/mybatis/*Mapper.xml"/>
  6. </bean>
  7. <bean id="simpleTempalte" class="org.mybatis.spring.SqlSessionTemplate">
  8. <constructor-arg index="0" ref="sqlSessionFactory" />
  9. <constructor-arg index="1" value="SIMPLE"/>
  10. </bean>
  11. <bean id="batchTempalte" class="org.mybatis.spring.SqlSessionTemplate">
  12. <constructor-arg index="0" ref="sqlSessionFactory" />
  13. <constructor-arg index="1" value="BATCH"/>
  14. </bean>

  

GOF业务场景的设计模式-----工厂模式的更多相关文章

  1. GOF业务场景的设计模式-----策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 策略模式代码实现 interface IStrategy { public void doSomething(); } class ...

  2. GOF业务场景的设计模式-----单例模式

    个人觉得 纯粹的学习设计模式,是不对的.也不能为了使用设计模式,而硬搬设计模式来使用 单例模式可能是 最简单的设计模式也是 大家知道最多的设计模式.当然 ,有很多种写法 定义:确保一个类只有一个实例, ...

  3. GOF业务场景的设计模式-----观察者模式

    定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出 ...

  4. GOF业务场景的设计模式-----责任链模式

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 首先来看一段代码: public void tes ...

  5. GOF业务场景的设计模式-----设计模式六大原则

    单一职责原则(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1, ...

  6. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

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

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

  8. 转载 用Python实现设计模式——工厂模式

    转载自 SegmentFault作者 夏秋, https://segmentfault.com/a/1190000013053013 非常感谢这位作者的深入浅出的讲解. 前言 工厂模式,顾名思义就是我 ...

  9. [Design Pattern With Go]设计模式-工厂模式

    这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...

随机推荐

  1. 【spoj8222】Substrings

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  2. codeforces 723D: Lakes in Berland

    Description The map of Berland is a rectangle of the size n × m, which consists of cells of size 1 × ...

  3. CCNET+ProGet+Windows Batch搭建全自动的内部包打包和推送及管理平台

    所要用的工具: 1.CCNET(用于检测SVN有改动提交时自动构建,并运行nuget的自动打包和推送批处理) 2.ProGet(目前见到最好用的nuget内部包管理平台) 3.Windows Batc ...

  4. 利用iconv进行文件编码批量原地转换

    将当前目录及其所有子目录中的以 java 为后缀的文件,从 GB18030 转换为 UTF-8: find .  -name "*.java" -exec sh -c " ...

  5. bzoj4419[SHOI2013]发微博

    题意:给你一个初始没有边,点权均为0的无向图,三种操作:加边,删边,选择一个点将当前与之相邻的点(不包括自身)的点权+1,询问最后所有点的点权. 据说正解是set维护每个人的朋友,然后考虑每次加边.删 ...

  6. Fckeditor PHP/ASP File Upload Vul

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScrip ...

  7. JS-Math对象

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>M ...

  8. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  9. HTML5预学习 长期更新

    HTML5 仍处于完善之中. 为 HTML5 建立的一些规则:          新特性应该基于 HTML.CSS.DOM 以及 JavaScript.          减少对外部插件的需求(比如 ...

  10. matlab注释

    单行注释: 两个'%': 多行注释: A. %{ 若干语句 %} B. 注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...