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调用传输文件异常的解决
Jun 24 Java/Android
ObjectMapper 如何忽略字段大小写
Jun 29 Java/Android
java解析XML详解
Jul 09 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
Android Studio 计算器开发
May 20 Java/Android
Java中Dijkstra(迪杰斯特拉)算法
May 20 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 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
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
XP折叠菜单&仿QQ2006菜单
2006/12/16 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
理解javascript对象继承
2016/04/17 Javascript
js中Number数字数值运算后值不对的解决方法
2017/02/28 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
Python栈类实例分析
2015/06/15 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Django的分页器实例(paginator)
2017/12/01 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
英文请假条
2014/04/11 职场文书
环保倡议书范文
2014/05/12 职场文书
小学亲子活动总结
2014/07/01 职场文书
身边的榜样活动方案
2014/08/20 职场文书
交警失职检讨书
2015/01/26 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle