工厂方法模式

简介: 工厂方法模式

前言

上一篇文章讲述了简单工厂模式,其实简单工厂模式也算是工厂方法模式的其中一种,简单工厂模式的最大优点工厂中集成了必要的逻辑判断,根据客户端的选择动态的生成实例化类。从而去除与具体产品的依赖性。但是工厂方法中承载了太多的功能,当有新的需求就需要在工厂中添加新的case判断语句。违背了“开闭原则”(对扩展开放,对修改关闭)。


一、工厂方法模式的含义

含义:将尽量长的代码分割成为小段代码然后封装,从而减少每段代码之间的耦合。操作起来就是定义一个用于创建对象的接口,让子类决定实例化哪个类对象,就是让一个产品类的实例化延迟到其工厂的子类进行。

1.UML图关系展示

2.工厂方法模式细节代码演示

这里笔者使用健身相关概念进行解释,为了便于区分直接使用拼音作为类名

1.首先定义抽象类----手臂训练类

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public abstract class shoubixunlianlei {
    public String doTraining(){
        System.out.println("手臂训练类");
        return "手臂训练类";
    }
}


2.分别将手臂训练类的五个子类分别实现

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class yalingertouwanjulei extends shoubixunlianlei{
    @Override
    public String doTraining() {
        System.out.println("我做哑铃二头弯举训练");
        return super.doTraining();
    }
}


package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class shengsuowanjulei extends shoubixunlianlei{
    @Override
    public String doTraining() {
        System.out.println("我做绳索弯举训练");
        return super.doTraining();
    }
}


package com.shuyixiao.工厂方法模式;/**
 *
 * @author 舒一笑
 * @date 2023/4/28
 */public class shengsuobiqushenlei extends shoubixunlianlei{
    @Override
    public String doTraining() {
        System.out.println("我做绳索臂屈伸类训练");
        return super.doTraining();
    }
}


package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class yalingwanjuchaojizulei extends shoubixunlianlei{
    @Override
    public String doTraining() {
        System.out.println("我做哑铃弯举超级组训练");
        return super.doTraining();
    }
}


package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class shengsuowanjuchaojizulei extends shoubixunlianlei{
    @Override
    public String doTraining() {
        System.out.println("我做绳索弯举超级组训练");
        return super.doTraining();
    }
}

3.定义训练工厂接口

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public interface xunliangongchangjiekou {
    shoubixunlianlei getInstance();
}


4.分别在具体各自的工厂(基础训练和进阶训练完成对象创建)

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class jichushoubixunliangongchang implements xunliangongchangjiekou{
    @Override
    public shoubixunlianlei getInstance() {
        return new shengsuobiqushenlei();
    }
}

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class jinjieshoubixunliangongchang implements xunliangongchangjiekou{
    @Override
    public shoubixunlianlei getInstance() {
        return new shengsuowanjuchaojizulei();
    }
}

5.客户端的调用

package com.shuyixiao.工厂方法模式;

/**
 * @author 舒一笑
 * @date 2023/4/28
 */
public class Shuyixiao {

    public static void main(String[] args) {
        jichushoubixunliangongchang jichushoubixunliangongchang = null;

        shoubixunlianlei instance = jichushoubixunliangongchang.getInstance();

        String s = instance.doTraining();

        System.out.println("s = " + s);
    }
}

二、工厂方法模式的总结

1.主要角色

抽象工厂:提供创建产品的接口,调用者通过访问它具体工厂的方法来创建产品,上述中就是使用训练工厂接口来当作抽象工厂,定义了getInstance()方法获取对象实例


具体工厂:实现抽象工厂中的抽象方法,完成对具体产品的创建,上述例子中就是基础手臂训练工厂和进阶手臂训练工厂,实现对自己类的创建

抽象产品:定义了产品的规范,描述了产品的功能和主要特性,上述例子中定义了手臂训练类作为抽象产品

具体产品:实现了抽象产品角色定义的接口或者继承某个抽象类作为父类,并重写其中的方法完成对具体产品的定义,上述代码中则是五个各自的手臂训练计划类。

2.优缺点分析

优点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

3.使用场景

  • 需要使用很多重复代码创建对象时,比如,DAO 层的数据对象、API 层的 VO 对象等。
  • 创建对象要访问外部信息或资源时,比如,读取数据库字段,获取访问授权 token 信息,配置文件等。
  • 创建需要统一管理生命周期的对象时,比如,会话信息、用户网页浏览轨迹对象等。
  • 创建池化对象时,比如,连接池对象、线程池对象、日志对象等。这些对象的特性是:有限、可重用,使用工厂方法模式可以有效节约资源。
  • 希望隐藏对象的真实类型时,比如,不希望使用者知道对象的真实构造函数参数等。


相关文章
|
5月前
|
人工智能 运维 监控
WebGL 开发数字孪生项目
本文详解WebGL/WebGPU数字孪生开发路径:涵盖Three.js/Babylon.js/Cesium.js引擎选型、glTF模型优化、WebSocket实时数据驱动、空间分析与报警漫游等交互模块,以及Draw Call/纹理/后处理等性能红线,并前瞻WebGPU计算着色器带来的物理仿真新可能。(239字)
|
存储 运维 物联网
RFID电力巡检管理应用
RFID技术在电力巡检中广泛应用,可显著提升效率、准确性和可靠性。通过为设备安装RFID标签,记录全生命周期信息,结合GIS技术优化巡检路线。巡检人员使用手持终端读取标签,自动记录到达时间与数据,减少人工错误。系统支持异常上报、数据分析和维护提醒,实现设备精细化管理。RFID技术助力电力企业降低运维成本,延长设备寿命,保障电网稳定运行。
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
2583 2
|
存储 网络安全
Curl error (60): SSL peer certificate or SSH remote key was not OK for https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/x86_64/repodata/repomd.xml [SSL: no alternative certificate subject name matches target host name 'update.cs2c.com.cn']
【10月更文挑战第30天】在尝试从麒麟软件仓库(ks10-adv-os)下载元数据时,遇到 SSL 证书验证问题。错误提示为:`Curl error (60): SSL peer certificate or SSH remote key was not OK`。可能原因包括证书不被信任、证书与域名不匹配或网络问题。解决方法包括检查网络连接、导入 SSL 证书、禁用 SSL 证书验证(不推荐)、联系仓库管理员、检查系统时间和尝试其他镜像。
5438 1
|
Ubuntu Linux 测试技术
Linux终端玩转bastet俄罗斯方块小游戏
【7月更文挑战第14天】Linux终端玩转bastet俄罗斯方块小游戏
551 7
|
测试技术 Linux Docker
【好玩的开源项目】Docker部署cook菜谱工具
【7月更文挑战第19天】Docker部署cook菜谱工具
659 1
|
小程序 前端开发 开发者
微信小程序之框架
微信小程序之框架
316 0
|
存储 网络协议 安全
网络知识大集合(最详细)与网络通信过程
首先 我碰到了一个问题,一个数据包从我们的电脑上,经过层层的交换机、路由器到达目标服务器的过程中,数据包会有哪些改动,是如何一步步传递过去又是如何返回回来的?
网络知识大集合(最详细)与网络通信过程
|
Java 编译器 C++
编码 GBK 的不可映射字符——【java菜鸟成长记】
编码 GBK 的不可映射字符——【java菜鸟成长记】
622 0
编码 GBK 的不可映射字符——【java菜鸟成长记】
|
Java 应用服务中间件 数据库连接
软件版本的GA、RC的具体含义
软件版本的GA、RC的具体含义
734 0
软件版本的GA、RC的具体含义

热门文章

最新文章