Java 深入探究讲解简单工厂模式


Posted in Java/Android onApril 07, 2022

1. 简单工厂介绍

简单工厂有一个具体的工厂类,可以生产不同的产品,属于创建型设计模式。

注意:简单工厂模式 不属于23种设计模式之列

2. 简单工厂类图UML

Java 深入探究讲解简单工厂模式

3. 简单工厂角色说明

简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类的创建产品类的方法可以被外界直接访问,创建所需的产品对象。

抽象产品(Product):是简单工厂创建所有对象的父类,负责描述所有实例公有的公共接口

具体产品(ConcreteProduct):是简单工厂创建的具体对象

4. 代码实现

简单工厂实现:

/**
 * 抽象产品,提供所有具体产品的共有的方法
 */
public interface Product {
    public void show();
}
​
/**
 * 具体产品1
 */
public class ConcreteProduct1 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品1展示...");
    }
}
​
​
/**
 * 具体产品2
 */
public class ConcreteProduct2 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品2展示...");
    }
}
​
/**
 * 简单工厂
 */
public class SimpleFactory {
    //提供一个方法,基于不同的参数获取不同的实例对象
    public static Product getConcreteProduct(int productType) {
        switch (productType) {
            case Const.Product1:
                return new ConcreteProduct1();
            case Const.Product2:
                return new ConcreteProduct2();
            case Const.Product3:
                return new ConcreteProduct3();
        }
        return null;
    }
​
​
    final class Const {
        static final int Product1 = 1;//表示是ConcreteProduct1产品
        static final int Product2 = 2;//表示是ConcreteProduct2产品
        static final int Product3 = 3;//表示是ConcreteProduct3产品
    }

调用方式:

//获取产品1
        Product product = SimpleFactory.getConcreteProduct(Const.Product1);
        product.show();
        //获取产品2
        Product product1 = SimpleFactory.getConcreteProduct(Const.Product2);
        product1.show();

使用步骤:

  • 创建抽象产品类和定义具体产品的公共接口
  • 创建具体产品类,定义生产的具体产品
  • 创建工厂类,通过创建静态方法根据传入不同的参数从而创建不同的具体产品的实例
  • 外界通过调用工厂类的静态方法,传入不同的参数创建不同的产品实例

5. 优缺点

优点:

  • 代码逻辑比较简单,工厂类包含必要的创建对象的逻辑,可以决定创建具体的产品
  • 调用方无需指导所创建具体产品的类名,只需要知道参数即可

缺点:

  • 简单工厂违背开闭原则,工厂类负责产品的创建职责过重,一旦新增产品需要对工厂类内部逻辑新增判断
  • 系统扩展困难,产品过多会造成逻辑过于复杂

6. 使用场景

对于产品种类比较少的情况,可以考虑使用简单工厂,调用方只需要传入工厂类的参数,不需要关注如何创建的逻辑.

到此这篇关于Java 深入探究讲解简单工厂模式的文章就介绍到这了,更多相关Java 简单工厂模式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
使用feign服务调用添加Header参数
Jun 23 Java/Android
java如何实现socket连接方法封装
Sep 25 Java/Android
spring cloud 配置中心客户端启动遇到的问题
Sep 25 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
springboot读取resources下文件的方式详解
Jun 21 Java/Android
springboot用户数据修改的详细实现
Apr 06 #Java/Android
Java中API的使用方法详情
Java 获取Word中所有的插入和删除修订的方法
springboot应用服务启动事件的监听实现
Apr 06 #Java/Android
Java十分钟精通进阶适配器模式
mapstruct的用法之qualifiedByName示例详解
Apr 06 #Java/Android
Spring Boot项目传参校验的最佳实践指南
You might like
玛琪朵 Macchiato
2021/03/03 咖啡文化
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
python将文本转换成图片输出的方法
2015/04/28 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
python使用requests.session模拟登录
2019/08/09 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
基于Python 函数和方法的区别说明
2021/03/24 Python
机电一体化职业规划书
2014/01/07 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
同学聚会通知短信
2015/04/20 职场文书
家属联谊会致辞
2015/07/31 职场文书
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript