工厂方法模式(Factory method)以及与抽象工厂(abstract factory)的区别

先看经典说法,

Define an interface for creating an object, but let subclasses
decidewhich class to instantiate. Factory Method lets a class defer
instantiation to subclasses. ----Gang of Four (定义一个创建对象的接口,
让子类决定用哪个类来实例化对象。工厂方法把类的实现放在子类中完成。)

Gang of Four把这一段看作是这个模式的目的(intent),但我看更像该模式的方
法(apporach)。因为连形式都说的很清楚了。

1. 一个接口。
2. 接口中有一个创建方法。

对这个接口的使用必然涉及工厂模式。它的使用方式是多种多样的。

我们来看一个例子,

1.
public interface ImageReader {
public DecodedImage getDecodedImage();
}

2.
public class GifReader implements ImageReader {
public DecodedImage getDecodedImage() {
return decodedImage;
}
}

3.
public class JpegReader implements ImageReader { // ....
}

4.
public class ImageReaderFactory {
public static ImageReader getImageReader(InputStream is) {
int imageType = determineImageType(is);
switch(imageType) {
case ImageReaderFactory.GIF:
return new GifReader(is);
case ImageReaderFactory.JPEG:
return new JpegReader(is);
// etc.
}
}
}

5.
public class client{
public void useImageReader(){
ImageReader ir = ImageReaderFactory.getImageReader(is);
Decodedimage di = ir.getDecodedImage();
di.doSth();
}
}

使用工厂方法模式,必须要有1,2或3,5这三个环节。1是包含有创建方法的接口,
2或3是对接口的实现,5是客户端对接口的使用。变化比较多的就是第四个环节,
也就是new子类的环节。这个例子是在static方法中调用new来用子类来实例化接
口.

我们再看一个例子

public abstract class TemplateClient {
public Map queryDatabase(String queryString) {
RdfDatabase db = databaseFactory();

checkQueryIsValid(queryString);

return db.find(queryString);
}
public abstract RdfDatabase databaseFactory();

}

public class JenaClient extends TemplateClient {
public RdfDatabase databaseFactory() { return new JenaDatabase(); }

上面的例子中是在static方法中调用的new,而你完全可以根据具体情况在你想要
的任何地方做实例化工作,比如在另一个类中这样写:

TemplateClient t = new
JenaClient(); RdfDatabase rdf = t.databaseFactory();
rdf.queryDatabase("select * from table");

你也可以在TemplateClient的子类JenaClient中这样使用,

public class JenaClient extends TemplateClient {
public RdfDatabase databaseFactory() {
return new JenaDatabase();
}
//这样使用
public void use(){
queryDatabase("select * from table");
}
}


在这个例子中,TemplateClient既扮演了客户端(客户端在这里是指是使用创建方
法的对象)的角色,又扮演了工厂模式中的接口的角色。这个例子中,工厂方法
模式配合了模板模式(模板模式参见..)

工厂模式极为常见,它变化万千,但不变的是,实际上可以归为一点,存在一个
创建接口。只要你实现这个接口、使用这个接口,不可避免的就会使用工厂方法
模式,即使你没有意识到这一点。

比如有个抽象接口A, 如下

interface A{
ProductB b = createB();
}


你如果使用这样的创建接口A,就不可避免的要涉及对接口A的引用,以及对接口
A的实例化以及对ProdctB的引用。你只要使用了接口A,你的一系列做法就会符合
是工厂方法模式。

抽象工厂模式所不同的是,接口A所创建的对象不是产品,而是用来创建产品的工
厂。如下:

interface A{
Factory f = createFactory();
}


抽象工厂模式就是用工厂方法模式来实现的。所以它们二者很像。其实工厂方法
模式更准确的写法应该是这样:

interface A{
抽象对象B b = create具体对象B();
}


工厂方法模式不管抽象对象B是谁,这个对象是product也好,是工厂对象也好,
这都是工厂方法模式的应用,只是如果这个对象是工厂对象,则它会又延伸一套
抽象工厂模式。

抽象工厂也可以不用工厂方法模式配合,看这个例子,

public class client{
public void doSomething(){
MyAbstractFactory f = new MyConcreteFactory();
Product1 p1 = f.getProduct1();
Product2 p2 = f.getProduct2();
p1.doSomethingWith(p2);
}
}


这里用到了抽象工厂,MyAbstractFactory就是个抽象工厂。但抽象工厂的创建是
直接new出来来,如果你想换一个具体的工厂,你只能修改代码,该成这样,

MyAbstractFactory f = new MyAnotherConcreateFactory();

但如果配合上工厂方法模式,就可以变成这样,

public class client{
public void doSomething(){
MyAbstractFactory f = new MyConcreteFactory();
Product1 p1 = f.getProduct1();
Product2 p2 = f.getProduct2();
p1.doSomethingWith(p2);
}

public abstract MyAbstractFactory createFactory();
}

public class ASubClass extends client{
public MyAbstractFactory createFactory(){
return new MyConcreteFactory();
}
}


这是工厂方法模式,就像前面说的那样,它有一个创建接口(abstract
createFactory()可以看做接口),有对这个接口的实现。它也是抽象工厂模式。
或者说,这种抽象工厂的创建,使用了工厂方法模式。

希望这篇文章能帮你从形式上理解工厂方法模式以及它和抽象工厂模式的区别。
关于抽象工厂的详细讲解,请参考http://hi.baidu.com/dapplehou/blog/item /f4645edf52a4c21f4954038a.html
C++设计模式_09_Abstract Factory 抽象工厂 /数据库访问有关的基类public://支持SQL Serverpublic://支持Oraclepublic://关联性//关联性因为这3个factory特别有相关性,那用1个factory就可以了,将这3个类放在一起,实现高内聚松耦合。大家看到这里就发现使用一个工厂,这就保证了关联性,解决了上面提到问题。从上面的代码可以看出Abstract Factory 其实被称为。 阅读详情

相关推荐

四旋翼黑科技揭秘:如何利用PX4隐藏的角加速度数据提升控制性能

本文深入探讨了如何利用PX4飞控中隐藏的角加速度数据,结合增量非线性动态逆(INDI)控制方法,显著提升四旋翼无人机的控制性能。通过实战教程,指导开发者从数据订阅、INDI原理到代码实现,构建响应更快、鲁棒性更强的控制回路,有效应对突风与快速机动。

lake5的博客 720

3小时搭建SpringBoot+Vue3图书管理系统:毕业设计实战指南

在现代Web应用开发中,前后端分离架构已成为主流范式,其核心在于通过RESTful API实现前后端职责解耦与独立部署。这一架构模式基于HTTP协议和JSON数据交换标准,允许前端专注于用户界面与交互逻辑,后端则集中于业务处理与数据持久化。其技术价值在于提升开发效率、增强系统可维护性,并支持技术栈的灵活选型。典型的应用场景包括企业管理系统、电商平台及内容展示网站。本文以SpringBoot和Vue3这一主流技术组合为例,详细演示如何快速构建一个完整的图书管理系统项目,涵盖从环境配置、数据库设计到前后端联调的

weixin_34054931的博客 635

最简解决 Unity Error Registry configuration is invalid Unable to connect https packages.unity.cn

前言 在学习其他大佬项目的时候,大佬说项目能直接运行,然后我拉下来就报如下错误 Unity报错:[Package Manager]Error Registry configuration is invalid:Unable to connect “https://packages.unity.cn” 翻了很多博发现是 unity3d 中国增强版的原因,中国增强版屏蔽了国外自定义的插件仓库。 安装 非中国增强版后可以成功打开。 然后大家给出的解决方案都比较激进,大抵就是更换Unity版本就OK了。 当然我是觉

Gipsyz的博客 6842

Factory method 和 Abstract factory的区别

Factory method: You have a factory that creates objects that derive from a particular base class 翻译:你有一个继承特定基类的派生类工厂,它能创建不同对象 Abstract factory: You have a factory that creates other factories, and

SprintfWater的专栏 1745

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 910

【Power Compiler手册】13.UPF多电压设计实现(2)

在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的原子电源域,并且确认所有属性都匹配。因此,域合并成功,工具会丢弃来自BLOCK的域。在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的非原子电源域,发现电源域不匹配。在这个场景中,在约束传播期间,工具会比较BLOCK中的非原子电源域与TOP设计中的原子电源域,发现电源域不匹配。在这个场景中,在约束传播期间,工具会比较BLOCK中的原子电源域与TOP设计中的原子电源域,发现它们的一些属性不匹配。

QRBQ 750

Java设计模式 —— 工厂方法(Factory Method)模式 、抽象工厂(Abstract Factory)模式

Java设计模式 —— 工厂方法(Factory Method)模式 、抽象工厂(Abstract Factory)模式 工厂模式的定义 “Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class de...

许浑的博客 1043

手把手教你学Simulink——基于传统电网建模与稳定性分析的场景实例:基于同步发电机的单机无穷大系统建模与稳定性分析

本文详细介绍了使用MATLAB/Simulink进行单机无穷大系统(SMIB)建模与稳定性分析的方法。教程从系统结构设计入手,包含同步发电机、输电线路、无穷大母线等核心模块的建模步骤和参数配置示例。重点讲解了七个关键步骤:项目创建、模块配置、控制系统集成、负载添加(可选)以及仿真运行与结果分析,并提供了具体的MATLAB代码示例。最后通过性能评估指标(功角差、电压跌落、频率偏差)分析系统稳定性,为电力系统动态特性研究提供了实用指导,强调准确参数设置对仿真结果的重要性。

MHD0815的博客 298

Factory Method vs Abstract Factory

Factory Method vs Abstract Factory

u010373266的博客 2014

2026年Java 开发工程师常见面试简答题

本文整理了Java开发工程师面试常见简答题及详细解析,涵盖Java基础、集合框架、并发编程、JVM等核心考点。主要内容包括:1. Java基础概念:JDK/JRE/JVM区别、面向对象特性、重载与重写、接口与抽象类、String特性等 2. 集合框架:ArrayList/LinkedList区别、HashMap实现原理、线程安全方案、集合类型对比 3. 并发编程:synchronized原理、volatile作用、线程创建方式、线程池参数与策略、死锁处理 4. JVM相关:内存区域划分、垃圾回收算法、类加载

不务正业的猿 370

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 711

23种设计模式--工厂模式(FactoryMethod)和 抽象工厂(AbstractFactory)

工厂模式(FactoryMethod)工厂模式(FactoryMethod)优缺点工厂模式结构图解代码模式的应用场景模式的扩展 工厂模式(FactoryMethod) 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违

qq_37271924的博客 922

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+

工厂方法模式和抽象工厂模式有什么区别?在什么情况下使用它们?

工厂方法模式关注于创建单个产品,它通过定义一个抽象的工厂类,该工厂类包含一个抽象的工厂方法,具体的产品创建由子类工厂来实现。每个具体的工厂类都负责创建一种具体的产品,这样就实现了产品的创建和工厂的分离。抽象工厂模式关注于创建一组相关的产品,它引入了一个抽象的工厂接口,该接口包含一组抽象的工厂方法,每个工厂方法用于创建一类相关的产品。总之,工厂方法模式适用于创建单一产品,具有更多的灵活性,而抽象工厂模式适用于创建一组相关的产品,具有更强的扩展性和变化适应性。

越努力越幸运。 816

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

ProgramNovice的博客 2037

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

工厂方法和抽象工厂——Factory Method & Abstract Factory

一、使用抽象工厂和工厂方法 Factory Method Pattern工厂方法  和  Abstract Factory Pattern抽象工厂  是两种不同的设计模式。《Java设计模式》书上给出了如下定义,但是Sam觉得有点问题,在网上找了找资料,在后文将给出我自己的理解。   Factory Method Pattern   P167     The intent ...

chuanwang66的专栏 175

visio安装包

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

设计模式——工厂方法模式(FactoryMethod)和抽象工厂模式(Abstract Factory)

工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).      这两个模式没有很明显的区别,区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,我们就可能要将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现。下面关于是在网络中查到关于工厂方法模式与抽象工厂模式的概述和区别:工厂方法模式: 

张明亮 1261

小谈抽象工厂模式与工厂方法,Abstract Factory Pattern and Factory Method

问题:从我所阅读的材料中,我看到:工厂方法模式允许你定义一个方法,这个方法可以创建一个实实在在的商品,但是却隐藏了实现细节,这样客户(client)可以得到产品。我第一个问题是关于抽象工厂:是不是抽象工厂模式只允许你创建一系列对象而不是仅仅一个对象?是不是抽象工厂只会根据你调用的方法返回一个很大的对象,或者许多对象?第二个问题是,我不是很理解这样一句话: 使用抽象工厂模式,一个类的责任就是实例化

请叫我搞向 878

[从零开始学设计模式-java]抽象工厂模式(Abstract Factory Method)

前两篇学习的是简单工厂模式,工厂方法模式。简单工厂模式中,工厂类的方法是静态的,不能被子类继承,违反了开闭原则;工厂方法模式中,将工厂类设置为抽象或者接口形式,这样,当增加工厂的时候,我们只需要让其继承或者实现抽象工厂中的方法,而不需要修改工厂类中的内部逻辑。这里有一个疑问,既然工厂类中已经涉及到抽象或者接口的概念,为什么不叫抽象工厂模式呢?抽象工厂模式与工厂方法模式又有什么不同呢? 抽

a530552571的专栏 350

设计模式之“对象创建“模式:Factory Method、Abstract Factory、Prototype、Builder

文章目录 ★1. Factory Method 工厂模式 1.1 Factory Method 工厂模式动机 1.2 模式定义 1.3 示例代码 1.4 要点总结 ★2. Abstract Factory 抽象工厂模式 2.1 Abstract Factory 抽象工厂模式动机 2.2 模式定义 2.3 示例代码 2.4 要点总结 3. Prototype 原型模式 3.1 Prototype 原型模式动机 3.2 模式定义 3.3 示例代码 3.4 要点总结 4. Builder 构建器模式 4.

To the beyond and infinity! 609

工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)

工厂方法模式(Factory Method)http://www.cnblogs.com/Terrylee/archive/2006/01/04/310716.html 抽象工厂模式(Abstract Factory)http://terrylee.cnblogs.com/archive/2005/12/13/295965.html 对工厂模式有了一定的了解,但是我没有看出这两种模式有什么区别...

weixin_30773135的博客 81

Understanding Factory Method and Abstract Factory Patterns(理解工厂方法模式和抽象工厂模式)

前言:     在设计模式中,最普遍和最流行的是工厂方法模式和抽象工厂模式,同时也是最让初学者困惑的那种模式。     这篇文章通过清晰的例子梳理了这两个“必须得知道”的设计模式,同时也进一步地讲解了两种模式之间的区别。最后我们也可以看到这两种模式的长处和短处。 工厂方法模式:     在GOF中,工厂方法模式是这样定义的:     “定义一个创建对象的接口,但是让子类决定具体实例化哪一

daoxwj的专栏 1345

设计模式(创建型)之抽象工厂模式(Abstract Factory Pattern)

PS一句:最终还是选择优快云来整理发表这几年的知识点,该文章平行迁移到优快云。因为优快云也支持MarkDown语法了,牛逼啊!概述前面介绍了工厂方法模式通过引入工厂等级结构(实现统一的工厂接口),解决了简单工厂模式中工厂类职责太重(违背单一职责原则)的问题,但是由于工厂方法模式中的每个工厂只生产一类产品(通过实现同一个工厂接口),带来的问题就是系统中会增加大量的工厂类。问题来了。。。如何解决如

工匠若水 3871

Factory Method

一、 工厂方法(Factory Method)模式工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而

Ivan Song的专栏 7145

工厂模式(Factory Pattern)之简单工厂,工厂方法模式(Factory Method Pattern),抽象工厂模式(Abstract Factory Pattern)

《Head First》介绍了工厂模式的3个内容: 一、简单工厂 简单工厂并非一个模式,反而像是一个编程习惯,其本质是抽出了对象复杂多变的实例化过程到另外一个单独的类,以保证其他代码的不变。 通常是实例化的对象是拥有多类型的情况: 案例:可以用实例化水果派的例子 public class PatternDemo { public static void main(String[]

JohnZ的专栏 1180

四种创建型设计模式的含义理解和对比(抽象工厂模式+建造者模式+工厂方法模式+原型模式+单例模式)

创建型设计模式,包括 抽象工厂,工厂方法,建造者,原型,单例模式。并且使用同一个例子进行说明

zheyangyebuxingaaa的博客 1256
上一篇: 命令模式(command pattern)
下一篇: 职责链模式(Chain of responsibility)以及servlet中filter的原理
mmonkeyer
博客等级 码龄23年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值