设计模式之工厂方法模式

news/2024/10/20 13:40:20/

factory method design pattern

工厂方法模式的概念、工厂方法模式的结构、工厂方法模式的优缺点、工厂方法模式的使用场景、工厂方法模式的实现示例、工厂方法模式的源码分析


1、工厂方法的概念

  工厂方法模式,及简单工厂模式的升级版,其抽象了对象的创建,将对象的具体创建延迟到了其子类中。这样,当有新产品加入时,不用再修改已有的工厂类,只需要增加新产品的实现和新产品对应工厂的实现即刻。

2、工厂方法的结构

  • 抽象产品:定义产品的行为。
  • 具体产品:实现抽象产品,使产品具像化。
  • 抽象工厂:定义生产产品的行为。
  • 具体工厂:实现抽象工厂,来创建一个具体产品的对象实例。其与具体产品是一对一的关系。

factory-method-class

3、工厂方法的优缺点

  • 优点:
    • 用户只需要知道具体的产品工厂即刻得到产品,无需了解产品的创建过程。
    • 新增产品时只需要新增具体产品类和其对应的具体工厂类即刻,无需对已有的工厂类进行修改,符合开闭原则的要求。
  • 缺点:
    • 当系统中产品过多时,会使系统过于复杂。

4、工厂方法的使用场景

  • 需要创建对象的地方。
  • 需要灵活的、可扩展的框架。
  • 针对同种类不同属性的操作,如数据库中的 mysql、oracle 等。

5、工厂方法的实现示例

抽象产品:

public interface Product {/*** 定义产品行为*/void behavior();
}

具体产品一:

public class OneProduct implements Product {@Overridepublic void behavior() {System.out.println("我是产品一");}
}

具体产品二:

public class TwoProduct implements Product {@Overridepublic void behavior() {System.out.println("我是产品二");}
}

抽象工厂:

public interface Factory {/*** 生产* @return*/Product product();
}

具体工厂一:

public class OneFactory implements Factory {@Overridepublic Product product() {return new OneProduct();}
}

具体工厂二:

public class TwoFactory implements Factory {@Overridepublic Product product() {return new TwoProduct();}
}

测试:

public class FactoryMethodTest {public static void main(String[] args) {Factory oneFactory = new OneFactory();Factory twoFactory = new TwoFactory();Product oneProduct = oneFactory.product();Product twoProduct = twoFactory.product();oneProduct.behavior();twoProduct.behavior();}
}

测试结果:

我是产品一
我是产品二

6、工厂方法的源码分析

  slf4j 中的 Logger logger = LoggerFactory.getLogger(FactoryMethodTest.class) 就是工厂方法模式的实现体现。其中 Logger 接口就是抽象产品接口,具体产品类如 EventRecodingLogger、SubstituteLogger 等;ILoggerFactory 抽象类就是抽象工厂,SubstituteLoggerFactory 等就是具体工厂类。
  另外 spring 中的 FactoryBean、java.util.concurrent 中的 ThreadFactory、mybatis 中的 SqlSessionFactory 等就是工厂方法模式。

public interface Logger {...
}
public interface ILoggerFactory {/*** Return an appropriate {@link Logger} instance as specified by the* <code>name</code> parameter.* * <p>If the name parameter is equal to {@link Logger#ROOT_LOGGER_NAME}, that is * the string value "ROOT" (case insensitive), then the root logger of the * underlying logging system is returned.* * <p>Null-valued name arguments are considered invalid.** <p>Certain extremely simple logging systems, e.g. NOP, may always* return the same logger instance regardless of the requested name.* * @param name the name of the Logger to return* @return a Logger instance */public Logger getLogger(String name);
}
public class SubstituteLoggerFactory implements ILoggerFactory {...public synchronized Logger getLogger(String name) {SubstituteLogger logger = (SubstituteLogger)this.loggers.get(name);if (logger == null) {logger = new SubstituteLogger(name, this.eventQueue, this.postInitialization);this.loggers.put(name, logger);}return logger;}...
}

http://www.ppmy.cn/news/2717.html

相关文章

基于jsp+java+ssm考研指导平台-计算机毕业设计

项目介绍 本考研学习类的网站&#xff0c;采用了ssm框架技术和mysql数据库进行网站设计研发&#xff0c;系统具有前台展示&#xff0c;后台管理的设计模式&#xff0c;是一款典型的计算机毕业设计学习资料。前台主要展示了考研相关的资讯&#xff0c;方便用户在线注册并且留言…

043-推箱子游戏源代码3

上一讲:042-推箱子游戏源代码2 摘要: 1、使用JAVA基础知识 2、GUI界面编程实现推箱子界面,常用控件的综合应用; 3、使用JAVA绘图技术实现推箱子过程的绘图功能; 4、使用键盘事件,通过方向键实现推箱子过程; 5、使用音频技术,实现播放背景音乐功能; 6、使用IO流技…

小白学流程引擎-FLowable(五) — BPMN2.0模型规范

前言&#xff1a; 不用到处百度BPMN2的博客了&#xff0c;本篇文章带你系统掌握BPMN2规范的核心知识点。全文2万字&#xff0c;全覆盖BPMN2知识点&#xff0c;图文并茂&#xff0c;泡杯咖啡&#xff0c;慢慢细品&#xff5e; 一、BPMN是什么 BPMN&#xff08;Business Proces…

[附源码]计算机毕业设计JAVA中小企业人事管理系统

[附源码]计算机毕业设计JAVA中小企业人事管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

基于SSM的网红书购物商城(源码+论文+开题报告+答辩PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

PC的ARM的安全启动

其实还是很不习惯将PC和ARM联系起来&#xff0c;当然主要是因为我刚刚接触嵌入式没有多久&#xff0c;更别说服务器、PC端了。 脑子里固化了的X86。 于是这一篇学习一下&#xff0c;基于ARM的PC&#xff0c;是怎么利用这个ATF框架&#xff0c;进行安全启动的。 文章内容来自…

【夯实Kafka实战性能调优技能】消息队列服务端出现内存溢出OOM以及相关性能调优实战分析

内存问题 本篇文章介绍Kafka处理大文件出现内存溢出 java.lang.OutOfMemoryError: Direct buffer memory&#xff0c;主要内容包括基础应用、实用技巧、原理机制等方面&#xff0c;希望对大家有所帮助。 bin目录下的kafka-run-class.sh中须要配置的参数 kafka是由scala和jav…

目录索引整理

目录索引整理 1. 数据结构与算法笔记——用Go语言描述 2. search——bitmap的交并差补&#xff0c;加速版&#xff0c;位运算 3. search——LRU 4. search——bitmap&#xff0c;集合的交并差补 5. search——unionset 6. search——roaring bitmap&#xff0c;map slic…