设计模式——工厂方法

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用 文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场 阅读详情

以下是读《设计模式——可复用面向对象软件的基础》的读书笔记。

FACTORY METHOD工厂方法

 

1、 意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

2、 别名

虚构造器(Virtual Constructor)

3、 适用性

在下面情况下可以使用Factory Method模式:

  • 当一个类不知道它所必须创建的对象的类的时候。
  •  当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

4、 结构


5、 参与者

Product
              ——定义工厂方法所创建的对象的接口。

ConcreteProduct
             ——实现Product接口。

Creator
             ——声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
             ——可以调用工厂方法以创建一个Product对象。

ConcreteCreator
            ——重定义工厂方法以返回一个ConcreteProduct实例。

6、 协作

Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。

7、 效果

工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。

工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的。

下面是FactoryMethod貌似的另外两种效果:

1)为子类提供挂钩(hook)         用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。Factory Method给子类一个挂钩以提供对象的扩展版本。

2)连接平行的类层次        当一个类将它的一些职责委托给一个独立的类的时候,就产生了平行类的层次。工厂方法并不往往只是被Creator调用,客户可以找到一些有用的工厂方法。

8、 实现

当应用Factory Method模式时要考虑下面问题:

1)  主要有两种不同的情况            Factory Method模式主要有两种不同的情况:A第一种情况是,Creator类是一个抽象类并且不提供它所声明的工厂方法的实现。B第二种情况是,Creator是一个具体的类而且为工厂方法提供一个缺省的实现。

第一种情况需要子类来定义实现,因为没有合理的缺省实现。它避免了不得不实例化不可预见类的问题。

第二种情况中,具体的Creator主要因为灵活性才使用工厂方法。它所遵循的准则是,“用一个独立的操作创建对象,这样子类才能重定义它们的创建方式。”这条准则保证了子类的设计者能够在必要的时候改变父类所实例化的对象的类。

2)  参数化工厂方法       该模式的另一种情况使得工厂方法可以创建多种产品。工厂方法采用一个标识要被创建的对象种类的参数。工厂方法创建的所有对象将共享Product接口。

9、 示例

Product
package com.examples.pattern.factoryMethod;

/**   
*  工厂方法所创建的对象的接口    
*/
public interface Product {

    /**
     * 定义的一些方法
     */
    public void operate();
    
}
ConcreteProduct
package com.examples.pattern.factoryMethod;

/**   
*  具体的Product对象
*/
public class ConcreteProduct implements Product {

    @Override
    public void operate() {    //具体实现...
        System.out.println("operate ....");
    }

}
Creator
package com.examples.pattern.factoryMethod;

/**   
*  创建器,声明工厂方法  
*/
public abstract class Creator {
    
    /**
     * 创建Product的工厂方法
     * @return Product对象
     */
    protected abstract Product factoryMethod();
    
    /**
     * 示例方法,完成一些操作...
     */
    public void someOperation(){
        //通常在这些方法中需要调用工厂方法来获得Product对象。
        //获得是其子类定义的对象...
        Product product = factoryMethod();    
        product.operate();    //一些操作...
    }

}
ConcreteCreator
package com.examples.pattern.factoryMethod;

/**   
*  具体的创建器实现对象  
*/
public class ConcreteCreater extends Creator {

    @Override
    protected Product factoryMethod() {
        //重定义工厂方法,返回一个具体的Product实例。
        return new ConcreteProduct();
    }

}


Client
package com.examples.pattern.factoryMethod;

public class Client {

    public static void main(String[] args) {
        Creator creator = new ConcreteCreater();
        creator.someOperation();
    }

}



10、 相关模式

Abstract Factory经常用工厂方法来实现。

工厂方法通常在Template Method中被调用。

Prototypes不需要创建Creator子类。但是,他们通常要求一个针对Product类的Initialize操作。Creator使用Initialize来初始化对象。而Factory Method不需要这样的操作。

 


PySpark机器学习生产化陷阱:跨节点依赖问题的7种解决方案 隐式依赖陷阱使用ldd解决方案:在基础镜像中预装和路径冲突终极解法依赖树瘦身技巧用conda-tree可减少40%环境体积PySpark机器学习生产化的核心矛盾在于分布式环境的确定性与灵活性不可兼得。轻量级方案(1-3)牺牲一致性换取灵活性重量级方案(4-6)牺牲灵活性换取确定性混合方案(7)针对特殊场景补充正如某AI平台架构师所言:“环境一致性不是技术问题,而是工程纪律问题选择适合团队当前阶段的方案,建立严格的依赖管理流程,才能让PySpark真正扛起生产环境的大旗。 阅读详情

相关推荐

J-SCOPE实战:除了看波形,如何用它和JLink-RTT模式高效调试你的STM32变量?

本文详细介绍了如何利用J-SCOPE和JLink-RTT模式高效调试STM32变量,实现实时数据可视化。通过对比HSS和RTT模式的优劣,提供固件端配置、J-SCOPE设置及实战应用案例,帮助开发者快速掌握这一高效调试技术,特别适用于电机控制、传感器融合等需要实时监控的场景。

weixin_29159613的博客 445

设计模式(十一)Factory Method(工厂模式)

设计模式(十一)Factory Method(工厂模式)结构实例声明 Factory Method(工厂模式):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。 结构 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适用性 当一个类不知道它所必须创建的对象的类的时候。 当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助

wutiantesi的博客 189

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1271

Aha!设计模式(25)-工厂方法(6)

9. 实 现 关于实现的部分,《设计模式》书中的描述已经很详细了,所以这里只进行简单的归纳。   当应用Factory Method模式时要考虑下面一些问题: 1) 主要有两种不同的情况 Factory Method模式主要有两种不同的情况: (1)第一种情况是,Creator类是一个抽象类并且不提供它所声明的工厂方法的实现。 (2)第二种情况是,Creator是一个具体的类而且为工厂方...

面向对象思考 875

Oracle入门——基础语法篇

ROWID是Oracle中的一个伪列,用于唯一标识数据库中的每一行。在查询中,可以使用ROWID来定位和操作特定的行,例如,删除特定的行或更新特定的行。在Oracle中,子查询是指嵌套在另一个查询内部的查询语句,它可以作为主查询的一部分,用于提供额外的过滤条件、计算或数据源。在Oracle中,连接查询是通过使用JOIN子句将两个或多个表中的数据合并在一起,以获取满足特定条件的结果集。在Oracle数据库中,ROWID和ROWNUM都是用于对行进行标识和定位的伪列,它们在查询中的使用有一些不同之处。

麦当当的博客 3089

大模型量化技术全解析:从INT8到GPTQ/AWQ,降低部署成本实战指南

模型量化是一种通过降低神经网络权重和激活值的数据精度(如从FP16降至INT8/INT4),从而大幅减少模型内存占用和计算开销的核心模型压缩技术。其原理基于线性变换,将高精度浮点数映射到低精度整数表示,在硬件层面能利用专用低精度计算单元实现显著加速。这项技术的核心价值在于解决了大模型(如千亿参数LLM)部署时面临的高昂显存成本和推理延迟问题,使其能在消费级GPU和边缘设备上高效运行。当前,后训练量化(PTQ)因其无需重新训练的特性成为主流,衍生出GPTQ、AWQ、SmoothQuant等多种方法,广泛应用于

weixin_33804582的博客 630

简单工厂和工厂方法的优缺点及解决到生产的应用

以上代码实现,可以看出是满足我们想法的:1.开闭原则必须满足;满足2.工厂类提供唯一入口分发;避免新增业务增加新的工厂代码量。满足3.具体业务类且只需要实现自己的业务,其他的一概不需要关心。业务类扩展性好,且不用修改工厂类,或者增加工厂。满足。

HeiShuaiGuo的博客 1949

Python爬虫实战:如何通过解析JSON数据抓取抖音视频评论

本文介绍了如何使用Python爬虫抓取抖音视频评论数据。请求头伪造:通过使用随机的User-Agent,模拟真实用户的请求。代理池:使用代理IP来避免被封禁。JSON解析:直接从API接口获取JSON格式的数据,避免了动态加载内容的限制。需要注意的是,抓取网站数据时应遵守网站的爬虫协议,避免过度抓取影响网站性能或违反法律法规。希望本文能够帮助你掌握如何抓取和分析抖音视频评论数据!

2201_76125261的博客 3360

工厂方法模式

8.1 女娲造人的故事 东汉《风俗通》记录了一则神话故事:“开天辟辟,未有人民,女娲搏,黄土作人……”,讲述的内容就是大家非常熟悉的女娲造人的故事。开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种(即人类)来增加世界的繁荣,怎么制造呢? 别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏...

weixin_30779691的博客 351

无刷电机里的霍尔传感器,和 AS5600 编码器到底有什么区别?

摘要: 无刷电机中的霍尔传感器主要用于换相控制,提供6种状态反馈,无法实现精确角度测量。与AS5600磁编码器(分辨率4096)相比,霍尔仅能确保电机“转得对”,而编码器则用于高精度角度反馈。在机器人等需要位置闭环的场景中,两者需协同使用:霍尔负责基础换相,编码器提供精确角度控制。简单应用中可仅用霍尔,但高精度定位必须搭配编码器。

qq_45430571的博客 242

026:vue+threeJS 设置地面铺砖的效果

BoxGeometry 是 Three.js 中用于创建立方体或长方体的几何体类。它允许你指定立方体的宽度、高度、深度以及这三个方向上的分段数,从而控制立方体的细分程度。width: 立方体的宽度(沿 x 轴方向)。height: 立方体的高度(沿 y 轴方向)。depth: 立方体的深度(沿 z 轴方向)。widthSegments: 可选参数,指定立方体在 x 轴方向上的分段数,默认值为 1。heightSegments: 可选参数,指定立方体在 y 轴方向上的分段数,默认值为 1。

大剑师兰特的GIS世界 645

我所理解的设计模式——(c++实现)工厂方法模式

一、UML图 二、概念 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 三、角色 抽象工厂角色(Creator):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。 具体工厂角色(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用...

weixin_43665783的博客 268

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。 简单工厂简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。  工厂

superbeck的专栏 8万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++设计模式 - 简单工厂,工厂方法和抽象工厂

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ...

大秦坑王的专栏 2553

工厂方法设计模式

目录 -工厂方法设计模式 概念定义 应用场景 角色组成 案例代码 优、缺点 简单工厂模式、抽象工厂模式 2、工厂方法模式 概念定义: 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。 应用场景: 当一个类不知道它所需要的对象的类时 在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知...

Aaron_2521060899的博客 702

Java工厂方法设计模式及实现(枚举实现工厂方法设计模式)

简介 工厂方法设计模式是一种创建对象的模式,这种模式将创建对象的责任转移到工厂中。 工厂方法包含3部分内容:抽象接口、子类实现、工厂类。一般情况下工厂方法是通过传参来判断创建哪个子类的对象。当然,也可以通过枚举的方式实现工厂方法设计模式。 传统工厂方法设计模式 如下代码,通过CarFactory#createCar接收Class参数,创建子类实例 public interface Car { } ...

p7+的博客 1843

【深入设计模式】工厂模式—简单工厂和工厂方法

设计模式(Design pattern)是软件工程的基础,最近在对公司项目代码进行迭代升级之后,决定把设计模式相关的知识点拉出来再重新整理一遍进行分享。学习设计模式,不仅是为了面试,更是为了在工作中能够写出易于维护、扩展性好的代码,否则不考虑设计的功能代码也是在给后人挖坑(已经深受其害)。 首先分享的是工厂模式,将这部分分为两部分,第一部分是是简单工厂模式和工厂方法模式的介绍及演进,主要介绍这两种模式结构,以及如何从简单工厂衍生出工厂方法模式。第二部分是抽象工厂模式和工厂模式在源码应用(下一篇博客进行分..

SK_Jaco的博客 1587

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

23种设计模式-工厂方法设计模式

Hanson的博客 2035

设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中。 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及优缺点。当然,由于本人接触设计模式时间还不长,难免有疏漏之处,欢迎各位提出意见。考虑如今有一个产品,比如椅子,该椅子可以有多种风格,比如中式的,或者美式的。如果我们不想通过设计模式,想要什么类型的椅子,就可以直接实例化某个实体类获得。“ChineseChair.java”——实体类 “Client.java”——用户

weixin_42785235的博客 1942

简单工厂设计模式和工厂方法设计模式

简单工厂设计模式   不论学习哪一个设计模式,都要知道设计模式可以给我们带来哪些好处,以及我们为什么要学习设计模式。 根据老师教导以及个人的片面经验,我认为使用设计模式的目的是 : 增强代码的复用性以及可维护性。 可维护性就是以后是否方便扩展,增加了新的需求的话,代码是否好改,会不会出现非常难处理的问题,比如说代码没有很好地复用,构建一个对象的过程写到了很多不同的类中,如果要修改构建过程的...

333

彻底搞懂设计模式DesignPattern-工厂模式-简单工厂-工厂方法-静态工厂-抽象工厂

简单工厂 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 最简单的总结就是一个工厂全负责,里面有判断,用于生产实例 简单工厂模式是属于创建型模式,是工厂模式的一种。 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式. 首先,创建二者的共同接口: public int

Ping 304

漫谈设计模式之:简单工厂、工厂方法、抽象工厂

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!一个产品不止一个功能,比如我们为高端人群定制了一套出行方案,这个方案里面有配备的车辆,还有人群穿戴的衣服等,这些功能合在一起就成为了“人群”这个产品的功能。弱化一个工厂类通吃的概念,将生产产品的职责交给各自的产品工厂去完成,也就是每一个产品都有一个工厂类,负责完成本身产品的生产。显而易见,只要新增一个产品,就会对工厂类进行修改;

2401_84132496的博客 1040

设计模式(简单工厂、工厂方法、抽象工厂模式)

设计模式(简单工厂、工厂方法、抽象工厂模式) 一、实验目的 1.熟悉建模工具。 2.掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。 二、实验内容 1.简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot...

Elf.筱焱的博客 960

设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)

简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 简单工厂其实不是一个标准的的设计模式。 23种设计模式中只有「工厂方法模式」与「抽象工厂模式」 1. 简单工厂模式 //接口类 public interface Food { void food(); } // 实现类1 public class RiceBook implements Food{ @Override public vo.

Pole丶逐 284
上一篇: 设计模式——建造模式
下一篇: 设计模式——原型模式
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值