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 相关文章推荐
SpringCloud的JPA连接PostgreSql的教程
Jun 26 Java/Android
springboot拦截器无法注入redisTemplate的解决方法
Jun 27 Java/Android
jackson json序列化实现首字母大写,第二个字母需小写
Jun 29 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
java实现对Hadoop的操作
Jul 01 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
JavaWeb实现显示mysql数据库数据
Mar 19 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
Apr 12 Java/Android
java版 简单三子棋游戏
May 04 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 chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python 识别图片中的文字信息方法
2018/05/10 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
Ruby如何实现动态方法调用
2012/11/18 面试题
《和我们一样享受春天》教学反思
2014/02/07 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
服务行业演讲稿
2014/09/02 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
我是特种兵观后感
2015/06/11 职场文书
装修安全责任协议书
2016/03/22 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
python turtle绘图命令及案例
2021/11/23 Python