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

工厂方法模式 基本代码

  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. LINQ语法记录

    static void Main(string[] args) { List<Person> persons = new List<Person>(); persons.Add ...

  2. Linux su和sudo命令的区别,并获得root权限

    su(superuser) su表示切换用户,如: 输入:su命令后回车表示切换当前的用户到root用户,或者: 输入:su - root(或者其他用户名)这里加了"-"后表示也切 ...

  3. 使用Github Pages创建自己的网站

    这是一篇使用Github Pages创建自己网站的教程,操作很简单,相信,亲们肯定一学就会,但是大家也要有一定的github基础呀,所以小编给大家附上一个链接(http://www.cnblogs.c ...

  4. Android成长日记-数据存储之SQLite[1]

    [SQLite简介] SQLite是R.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行 ---支持高达2TB大小的数据库: ...

  5. CodeForces 125E MST Company

    E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...

  6. 开发新产品的三个验证阶段(EVT/DVT/PVT)

    1.EVT, Engineering Validation Test 是针对工程原型机的验证,对象很可能是一大块开发板,或是很多块开发板:关键是要有足够时间和样品. 通常,如果是新平台,需要花的时间和 ...

  7. Mac xcode 编译产生app的路径

    .../<current User>/Library/Developer/XCode/DerivedData/<Project name>-<other characte ...

  8. Linux 吃掉我的内存

    在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能.而当我 ...

  9. zoj 3946 Highway Project(最短路 + 优先队列)

    Highway Project Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the emperor of the Marjar ...

  10. JavaWeb---总结(十)HttpServletRequest对象(一)

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...