《设计模式》-- 工厂方法模式

DeepLabv3+改进专栏 🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。 阅读详情

工厂方法模式

认识

  1. 工厂方法的主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现.
  2. 工厂方法模式通常是针对Product接口的每个实现类都提供一个与之对应的Factory实现类用于创建该对象,这样能够实现更好的扩展性。
  3. 也可以把父类实现为一个具体的类,同时在父类中提供获取所需对象的默认实现方法,这样就算没有具体的子类去创建对象,也能够完成功能运行。

思考

  1. 工厂方法的本质:工厂是抽象的,只定义需要的对象,所需对象的创建延迟到工厂的子类中实现
  2. 相比于简单工厂和抽象工厂,有更好的扩展性,当增加一个Product的实现类时,只需要添加一个Factory与之对应的实现类就行。
  3. 工厂方法模式中工厂实现类一次方法只操作一个接口返回值,抽象工厂模式操作的是多个接口

优缺点

  1. 可以在不知道具体实现的情况下编程,解耦合。
  2. 更容易扩展对象的新版本,当有一个新的对象需要创建的时候创建一个新的工厂实现类返回新的对象。
  3. 缺点是每个Product的实现都需要创建一个Factory的实现,增加了客户端调用的选择难度。

使用场景

  1. 工厂方法模式作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式,比静态工厂模式更好的扩展。
  2. 工厂方法模式将具体的操作延迟到子类实现,当父类不做任何操作,将具体操作通过抽象方法延迟到子类去实现的时候可以使用。
  3. 当父类的操作需要一个对象的时候,提供抽象方法,让子类实现抽象方法创建需要的对象,同时在父类中定义使用该对象的公共方法,实现依赖倒置。

UML图

封装Product实现类的具体细节,创建一个抽象工厂,为每个Product接口的实现类都创建一个工厂实现类,在抽象方法中创建对应的Product的实现类对象。之后如果扩展Product的实现类,只需要扩展一个对象的工厂实现类就行。

image

客户端操作工厂方法的过程

image

代码实现

/**
 * 产品接口
 */
public interface IProduct {
    public void operation();
}

/**
 * 产品实现类A
 */
public class ConcreateProductA implements IProduct {

    public void operation() {
        System.out.println("创建产品A");
    }
}

/**
 * 产品实现类B
 */
public class ConcreateProductB implements IProduct {

    public void operation() {
        System.out.println("创建产品B");
    }
}

/**
 * 抽象工厂类
 *
 */
public abstract class Factory {

    /**
     * 定义抽象,具体实现延迟到子类中实现
     */
    protected abstract IProduct getProduct();

    /**
     * 提供方法供客户端调用
     */
    public IProduct createProduct() {
        // 进行操作
        IProduct product = this.getProduct();
        // 进行操作
        return product;
    }
}

/**
  * 工厂实现类A
  */
public class ConcreateFacotryA extends Factory {

    /**
     * 实现类中创建对应的product的子类返回
     */
    @Override
    protected IProduct getProduct() {
        return new ConcreateProductA();
    }

}
/**
  * 工厂实现类B
  */
public class ConcreateFacotryB extends Factory {

    /**
     * 实现类中创建对应的product的子类返回
     */
    @Override
    protected IProduct getProduct() {
        return new ConcreateProductB();
    }
}

/**
 * 客户端调用
 */
public class Client {

    public static void main(String[] args) {
        // 客户端调用 Factory的 ConcreateFacotryA 实现类创建对象
        Factory factoryA = new ConcreateFacotryA();
        IProduct productA = factoryA.createProduct();
        productA.operation();

        // 客户端调用 Factory的 ConcreateFacotryB 实现类创建对象
        Factory factoryB = new ConcreateFacotryB();
        IProduct productB = factoryB.createProduct();
        productB.operation();
    }
}

通过工厂方法模式实现依赖倒置,父类(接口)无法new实例,只定义操作,而操作中所需要的外部对象,由子类实现抽象方法去创建,将对象的创建延迟到子类中,能够实现更好的扩展。同时实现依赖倒置和延迟加载。

public abstract class A1 {
    /**
     * 工厂方法,创建C1,类似于从子类注入进来的途径
     * @return C1的对象实例
     */
    protected abstract C1 createC1();
    public void t1(){
        //这里需要使用C1,可是不知道究竟是用哪一个,也就不主动去创建C1了,怎么办?
        //反正会在子类里面实现,这样更省心,这里不用管怎么获取C1,直接使用就好了
        createC1().tc();
    }
}
public class A {
    /**
     * 等待被注入进来
     */
    private C c = null;
    /**
     * 注入资源C的方法
     * @param c 被注入的资源
     */
    public void setC(C c){
        this.c = c;
    }
    public void t1(){
        //这里需要使用C类,可是又不让主动去创建C了,怎么办?
        //反正就要求从外部注入,这样更省心,
        //自己不用管怎么获取C,直接使用就好了
        c.tc();
    }
}
public class A2 extends A1 {
    protected C1 createC1() {
        //真正的选择具体实现,并创建对象
        return new C2();
    }
}
FPGA JTAG接口设计全解析 JTAG是FPGA开发的核心接口,主要用于代码下载和在线调试。14-pin设计中包含TCK、TMS、TDI、TDO四个关键信号,采用信号-地布局增强抗干扰能力,TCK建议串联电阻。10-pin设计需注意转接适配,并推荐使用RCLAMP0524P等低电容TVS二极管进行ESD防护。两种接口设计都强调信号完整性和可靠性,建议PCB布局时保持JTAG走线短且预留调整空间。 阅读详情

相关推荐

毕设别再硬肝了:我用 GPT + Codex 做项目、写论文,效率直接起飞

这个也是神器。你项目做完之后,最怕的是老师一问就懵。这时候你直接把你的项目发给它,让它模拟老师提问。这是我的毕业设计题目和项目简介,请你站在答辩老师角度,提出20个高频问题,并给出简洁好背的回答。要求:问题尽量贴近计算机专业本科毕业答辩。为什么选这个题目?技术选型为什么这样定?你的创新点是什么?系统难点是什么?数据库怎么设计的?你的模型为什么选这个?如果继续优化,下一步怎么做?这个对答辩真的帮助很大。说实话,如果没有 GPT + Codex,

m0_74100417的博客 1843

工厂方法模式

<br />1  场景问题1.1  导出数据的应用框架<br />考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据的导出方式,并真正执行数据导出。<br />在一些实际的企业应用中,一个公司的系统往往分散在很多个不同的地方运行,比如各个分公司或者是门市点,公司没有建立全公司专网的实力,但是又不愿意让业务数据实时的在广域网上传递,一个是考虑数据安全的问题,一个是运行速度的问题。<br />这种系统通常会有一个折中的方案,那就是各个分公司内运行系统的时候是独立的,是在自己分公司的局域网内运行。

xiaoquanhuang的专栏 4153

PC微信(3.9.2.23)逆向实战:定位并Hook消息接收函数

本文详细介绍了PC微信(3.9.2.23)逆向分析中定位并Hook消息接收函数的完整实战流程。通过Cheat Engine动态定位未读消息数内存地址,结合OllyDbg分析代码上下文,最终找到稳定的Hook点,并分享了实战中的关键注意事项与踩坑经验。

lll78的博客 472

j2ee常用的设计模式?说明工厂模式

Java中的23种设计模式:Factory(工厂模式),Builder(建造模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式),Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模

v_fei的专栏 3638

AI漫剧制作全流程零基础实操指南:从剧本到剪辑

AI漫剧是一种利用AI工具将剧本、分镜、出图、配音、剪辑整合为流水线的短视频内容形式。其技术原理基于文生图、图生图与文本转语音模型的组合,核心挑战在于角色一致性控制与分镜批量出图。这项技术大幅降低了视频制作门槛,使个人创作者无需演员和设备即可产出剧情向短内容,广泛应用于短视频平台的情景剧、玄幻、甜宠等题材。本文给出了一套零基础可照做的全流程实操方案,覆盖剧本提示词、分镜表、出图选型、配音合成与剪辑模板,帮助你快速跑通AI漫剧制作链路。

weixin_29048309的博客 521

GROMACS新手必看:从PDB文件到完整分子动力学模拟的保姆级教程

本文提供GROMACS分子动力学模拟的保姆级教程,从PDB文件处理到完整模拟流程全覆盖。详细讲解结构预处理、系统构建、能量最小化、生产模拟等关键步骤,并分享性能优化和结果分析技巧,帮助新手快速掌握分子动力学模拟的核心操作。

yhn456789的博客 762

几种常用的设计模式介绍

几种常用的设计模式介绍 1.    设计模式的起源 最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander。在1970年他的《建筑的永恒之道》里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现。 在《建筑的永恒之道》里这样描述:模式是一条由三个部分组成的通用规则:它表示了一个特定环境、一类问题和一个解决方案之间的关系。每一个模式描述了一个不断

sengeiou的专栏 16万+

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

23种设计模式之工厂方法模式(Factory Method Pattern)【设计模式】

📒工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来让子类决定实例化哪一个类,使得一个类的实例化延迟到其子类。这种模式的核心思想是将对象的创建过程推迟到子类,从而实现更灵活、更可扩展的代码。// 抽象产品 - 文档。

李赛赛的专栏 1411

Linux ARM平台开发系列讲解(GMSL摄像头篇)1.2 MAX9296 GMSL链路配置

串行器 +解串器组成,软件需要做的就是写这三部分的驱动,让摄像头数据能到达。3. 配置解串器和串行器的GMSL链路。串行器和解串器上电成功之后,就可以配置。软件配置(注意软件只可以配置速率,2. 9296上电,使能芯片。的版本和速率,比如版本是配置。配置成功之后,就会出现串行器。的链路,其它同类型的。设备地址,我设置的是。...

DSMGUOGUO的博客 1万+

【回答问题】ChatGPT上线了!如何安装python-ipopt?python-ipopt有哪些用法?

python-ipopt是一种基于Python语言的求解非线性最优化问题的软件包。它使用了Interior Point Optimizer(IPOPT)算法来求解最优化问题。这段代码使用python-ipopt求解了一个无约束的非线性最小化问题,其目标函数为(x[0] - 1) ** 2 + (x[1] - 2) ** 2,求解结果为x_opt。求解线性规划问题、二次规划问题、二次范数最小化问题等类型的最优化问题。对于给定的最优化问题,可以设置不同的求解参数来控制求解的精度和效率。

源代码杀手的博客 2144

秒懂设计模式之工厂方法模式(Factory Method Pattern)

The essence of the Abstract Factory Pattern is to “Provide an interface for creating families of related or dependent objects without specifying their concrete classes.”.[5] abstract factory

ShuSheng007的程序人生 5224

ESP32学习笔记03-日志打印

日志分为5个等级。

Car12 1414

23种设计模式之工厂方法模式(Factory Method Pattern)

本篇文章将23种设计模式中的工厂方法模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式-工厂方法模式(Factory Method Pattern)

设计模式-工厂方法模式(Factory Method Pattern)

weixin_45226668的博客 1082

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

23种设计模式——工厂方法模式(Factory Method Pattern)详解

本文介绍了23种经典设计模式之——工厂方法模式(Factory Method Pattern)的说明及使用

Meteors.的博客 1381

设计模式:工厂方法模式(Factory Method Pattern)

工厂方法模式是一种创建型设计模式,主要解决对象创建的问题。它的核心思想是:把对象的创建和使用分离,让使用者不直接依赖具体类,而是通过工厂来获得对象。

TechNomad的博客 1016

设计模式精讲 Day 2:工厂方法模式(Factory Method Pattern)

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法让类的实例化延迟到子类中进行,从而避免了直接在客户端代码中硬编码具体的类名。核心思想:将对象的创建职责交给子类,而不是在父类中硬编码。该模式通过封装对象的创建逻辑,实现了对变化的隔离,使系统更加灵活、可扩展。Log/*** 日志记录器接口*/LogFactory工厂方法:关注单一产品的创建,每个工厂只负责一种产品。抽象工厂:关注一组相关产品的创建,适合创建多个相关对象。

在未来等你的专栏 1216

设计模式之工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但实际创建对象的工作由子类完成。这种模式的主要目的是降低类之间的耦合度,增强类的独立性,并提高系统的可维护性和可扩展性。工厂方法模式的主要特点(1)分离了算法和对象创建:通过工厂方法,我们可以将对象的创建和使用分离,使得代码更加清晰和易于维护。(2)实现多态:工厂方法允许子类实现自己的行为,从而支持不同的创建策略。(3)避免使用new关键字:工厂方法模式通过工厂方法代替new关键字,可以减少错误。

giser@2011的博客 1434

C#设计模式——工厂方法模式(Factory Method Pattern)

定义一个创建对象的接口,但由子类决定需要实例化那一个类。(工厂模式是我们常用的实例化对象模式了,是用工厂方法代替new 操作的一种模式,简单工厂的特点就是“简单粗暴”,通过一个含参的工厂方法,我们可以实例化任何产品类。:工厂方法模式中,具体的工厂只是生产具体的某一个产品。而抽象工厂模式的具体的工厂可以生产族产品(例如奔驰轿车、奔驰SUV、奔驰MPV)。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一种产品的继承结构,而抽象工厂模式需要面对多个产品的继承结构。

qq_57198771的博客 1719

C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】 原文:C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】 一、引言 在上一篇文章中我们讲解了过渡的一种模式叫做【简单工厂】,也有叫【静态工厂】的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变...

LJianDong的博客 683

设计模式一、 工厂方法模式(Factory Method Pattern)

设计模式一、 工厂方法模式(Factory Method Pattern)一、概念:定义一个用于创建对象的接口,让子类决定将哪个工厂类实例化。 (Factory Method使得一个类的实例化延迟到其子类)二、目的:解决接口选择的问题。三、方式:让其子类实现方法...

Ysunflower的博客 408

设计模式 工厂方法模式(Factory Method Pattern)

设计模式 工厂方法模式(Factory Method Pattern) 一、简述 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。将创建过程延迟到子类进行。 对比简单工厂模式:(简单举例) 简单工厂模式是客户端将需求参数传递给产品工厂,产品工厂返回对应的产品实例对象给客户端; 工厂方法模式是不同的产品由不同的工厂生产,客户端想要A产品,自己找A工厂创建,客户端想要B产品,就自己找B工厂创建。 例子打包:外...

Genven_Liang的博客 444

【C#设计模式】4.工厂方法模式(Factory Method Pattern)【创建型】

随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的If–Else–也越多,这样就会造成简单工厂的实现逻辑过于复杂。设计模式是遵循一定原则而得来的,比如,我们要怎么增加代码,怎么修改代码,不是想怎么来就怎么来的,其中一个原则就是OCP原则,中文是【开放关闭原则】,对增加代码开发,对修改代码关闭,所以我们就不能总是这样修改简单工厂里面的方法。......

星Yeah 的博客 4227

【设计模式】Java设计模式——工厂方法模式(Factory Method Pattern)

1. 介绍 1.1 定义 工厂方法模式(Factory Method Pattern)又称工厂模式、虚拟构造器模式、多台工厂模式,它属于创建型模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。 1.2 作用 将产品类的实例化操作延迟到工厂子类中完成,由工厂子类确定该实例化哪一个具体产品类 2. 模式结构 2.1 UML类图 2.2 模式组成 抽象工厂(Factory):具体工厂的父类,描述具体工厂的公共接口 具体工厂(Concrete Factory):被外部调用

Dust_heart的博客 970

创建型设计模式(3)—— 工厂方法模式(Factory Method Pattern)

1.概述使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。在前面的设计模式(四)——简单工厂模式中我们介绍了简单工厂模式,接下来将介绍下工厂方法模式,它同样是创建型设计模式,有相似之处,但又有些不同,文章的末尾会介绍他们之间的不同。这里借用...

Doublelv 的博客专栏。 1818
上一篇: 《设计模式》--简单工厂模式
下一篇: 《设计模式》-- 抽象工厂模式
fight_zhi
博客等级 码龄14年 27粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值