创建型-工厂模式

设计模式之创建型模式之单例模式、原型模式、工厂方法 一:设计模式简介与分类 简介 设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。 随着软件开发社群对设计模式的兴趣日益增长,已 阅读详情

目录

场景假设

代码示例说明

简单工厂模式

工厂方法模式

那什么时候该用工厂方法模式,而非简单工厂模式呢?

抽象工厂

总结


场景假设

我们根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器(JsonRuleConfigParser、XmlRuleConfigParser、YamlRuleConfigParser、PropertiesRuleConfigParser ),将存储在文件中的配置解析成内存对象 RuleConfig。

说明:实例代码中的 IRuleConfigParser 是解析器接口(interface),JsonRuleConfigParser、XmlRuleConfigParser、YamlRuleConfigParser、PropertiesRuleConfigParser 是解析器接口的实现类

 

代码示例说明

代码仅供说明使用,不考虑健壮性

简单工厂模式

实现方式1:每次都创建新的对象

public class RuleConfigSource {

    // 加载配置

    public RuleConfig load(String ruleConfigFilePath) {

        // 配置文件路径

        String configPath = "/Users/liangpeng/sky.json";

        // 读取配置

        String configText = readConfig(configPath);

        // 配置格式

        String configFormat = "json";

        // 根据配置格式获取配置解析器

        IRuleConfigParser parser = RuleConfigParserFactory.createParser(configFormat);

        // 将配置信息解析为 RuleConfig 对象

        RuleConfig ruleConfig = parser.parse(configText);

        return ruleConfig;

    }

}

 

// 每次创建新对象

public class RuleConfigParserFactory {

    public static IRuleConfigParser createParser(String configFormat) {

        IRuleConfigParser parser = null;

        if ("json".equalsIgnoreCase(configFormat)) {

            parser = new JsonRuleConfigParser();

        } else if ("xml".equalsIgnoreCase(configFormat)) {

            parser = new XmlRuleConfigParser();

        } else if ("yaml".equalsIgnoreCase(configFormat)) {

            parser = new YamlRuleConfigParser();

        } else if ("properties".equalsIgnoreCase(configFormat)) {

            parser = new PropertiesRuleConfigParser();

        }

        return parser;

    }

}

实现方式2:如果工厂创建出的对象可以复用,可以将对象缓存起来,每次从缓存中取出对象直接使用

public class RuleConfigParserFactory {

    private static final Map<String, RuleConfigParser> cachedParsers = new HashMap<>();

 

    static {

        cachedParsers.put("json", new JsonRuleConfigParser());

        cachedParsers.put("xml", new XmlRuleConfigParser());

        cachedParsers.put("yaml", new YamlRuleConfigParser());

        cachedParsers.put("properties", new PropertiesRuleConfigParser());

    }

 

    public static IRuleConfigParser createParser(String configFormat) {

        if (configFormat == null || configFormat.isEmpty()) {

            return null;// 返回null还是IllegalArgumentException全凭你自己说了算

        }

        IRuleConfigParser parser = cachedParsers.get(configFormat.toLowerCase());

        return parser;

    }

}

尽管“简单工厂模式”的代码实现方式1中,有多处 if 分支判断逻辑,违背开闭原则,但权衡扩展性和可读性,这样的代码实现在大多数情况下(比如,不需要频繁地添加 parser,也没有太多的 parser)是没有问题的。

工厂方法模式

如果我们非得要将 if 分支逻辑去掉,那该怎么办呢?比较经典处理方法就是利用多态。按照多态的实现思路,对上面的代码进行重构。重构之后的代码如下所示:

// 工厂接口

public interface IRuleConfigParserFactory {

    IRuleConfigParser createParser();

}

 

public class JsonRuleConfigParserFactory implements IRuleConfigParserFactory {

    @Override

    public IRuleConfigParser createParser() {

        return new JsonRuleConfigParser();

    }

}

 

public class XmlRuleConfigParserFactory implements IRuleConfigParserFactory {

    @Override

    public IRuleConfigParser createParser() {

        return new XmlRuleConfigParser();

    }

}

 

public class YamlRuleConfigParserFactory implements IRuleConfigParserFactory {

    @Override

    public IRuleConfigParser createParser() {

        return new YamlRuleConfigParser();

    }

}

 

public class PropertiesRuleConfigParserFactory implements IRuleConfigParserFactory {

    @Override

    public IRuleConfigParser createParser() {

        return new PropertiesRuleConfigParser();

    }

}

这就是工厂方法模式的典型代码实现。这样当我们新增一种 parser 的时候,只需要新增一个实现了 IRuleConfigParserFactory 接口的 Factory 类即可。所以,工厂方法模式比起简单工厂模式更加符合开闭原则。

从上面的工厂方法的实现来看,一切都很完美,但是实际上存在挺大的问题。问题存在于这些工厂类的使用上。接下来,我们看一下,如何用这些工厂类来实现 RuleConfigSource 的 load() 函数。具体的代码如下所示:

public class RuleConfigSource {

    public RuleConfig load(String ruleConfigFilePath) {

        // 配置文件路径

        String configPath = "/Users/liangpeng/sky.json";

        // 读取配置

        String configText = readConfig(configPath);

        // 配置格式

        String configFormat = "json";

        // 根据配置格式获取解释器工厂类

        IRuleConfigParserFactory parserFactory = createParserFactory(configFormat);

        // 创建解析器

        IRuleConfigParser parser = parserFactory.createParser();

        RuleConfig ruleConfig = parser.parse(configText);

        return ruleConfig;

    }

 

    // 根据配置格式获取解释器工厂类

    private IRuleConfigParserFactory createParserFactory(configFormat) {

        IRuleConfigParserFactory parserFactory = null;

        if ("json".equalsIgnoreCase(configFormat)) {

            parserFactory = new JsonRuleConfigParserFactory();

        } else if ("xml".equalsIgnoreCase(configFormat)) {

            parserFactory = new XmlRuleConfigParserFactory();

        } else if ("yaml".equalsIgnoreCase(configFormat)) {

            parserFactory = new YamlRuleConfigParserFactory();

        } else if ("properties".equalsIgnoreCase(configFormat)) {

            parserFactory = new PropertiesRuleConfigParserFactory();

        }

    }

}

从上面的代码实现来看,工厂类对象的创建逻辑又耦合进了 load() 函数中,跟我们最初的代码版本非常相似,引入工厂方法非但没有解决问题,反倒让设计变得更加复杂了。那怎么来解决这个问题呢?

我们可以为工厂类再创建一个简单工厂,也就是工厂的工厂,用来创建工厂类对象或者说用来管理工厂类对象。代码如下,其中 RuleConfigParserFactoryMap 类是创建工厂对象的工厂类,getParserFactory() 返回的是缓存好的单例工厂对象。

public class RuleConfigSource {

    public RuleConfig load(String ruleConfigFilePath) {

        // 配置文件路径

        String configPath = "/Users/liangpeng/sky.json";

        // 读取配置

        String configText = readConfig(configPath);

        // 配置格式

        String configFormat = "json";

        // 根据配置格式获取配置解析工厂

        IRuleConfigParserFactory parserFactory = RuleConfigParserFactoryMap.getParserFactory(configFormat);

        // 获取配置解析器

        IRuleConfigParser parser = parserFactory.createParser();

        // 解析配置

        RuleConfig ruleConfig = parser.parse(configText);

        return ruleConfig;

    }

}

 

//因为工厂类只包含方法,不包含成员变量,完全可以复用,

// 不需要每次都创建新的工厂类对象,所以,简单工厂模式的第二种实现思路更加合适。

public class RuleConfigParserFactoryMap {

    //工厂的工厂

    private static final Map<String, IRuleConfigParserFactory> cachedFactories = new HashMap<>();

 

    static {

        cachedFactories.put("json", new JsonRuleConfigParserFactory());

        cachedFactories.put("xml", new XmlRuleConfigParserFactory());

        cachedFactories.put("yaml", new YamlRuleConfigParserFactory());

        cachedFactories.put("properties", new PropertiesRuleConfigParserFactory());

    }

 

    public static IRuleConfigParserFactory getParserFactory(String type) {

        if (type == null || type.isEmpty()) {

            return null;

        }

        IRuleConfigParserFactory parserFactory = cachedFactories.get(type.toLowerCase());

        return parserFactory;

    }

}

那什么时候该用工厂方法模式,而非简单工厂模式呢?

    将复杂代码剥离出来,独立为函数或者类。剥离之后能让代码更加清晰,更加可读、可维护。但是,如果代码块本身并不复杂,就几行代码而已,我们完全没必要将它拆分成单独的函数或者类。

    基于这个设计思想,当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂。

    除此之外,在某些场景下,如果对象不可复用,那工厂类每次都要返回不同的对象。如果我们使用简单工厂模式来实现,就只能选择“简单工厂模式”第一种包含 if 分支逻辑的实现方式。如果我们还想避免烦人的 if-else 分支逻辑,这个时候,我们就推荐使用工厂方法模式。

 

抽象工厂

定义:抽个毛线抽

总结

    当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。何为创建逻辑比较复杂呢?我总结了下面两种情况。

  • 第一种情况:类似规则配置解析的例子,代码中存在 if-else 分支判断,动态地根据不同的类型创建不同的对象。针对这种情况,我们就考虑使用工厂模式,将这一大坨 if-else 创建对象的代码抽离出来,放到工厂类中。
  • 还有一种情况,尽管我们不需要根据不同的类型创建不同的对象,但是,单个对象本身的创建过程比较复杂,比如前面提到的要组合其他类对象,做各种初始化操作。在这种情况下,我们也可以考虑使用工厂模式,将对象的创建过程封装到工厂类中

 

     对于第一种情况,当每个对象的创建逻辑都比较简单的时候,我推荐使用简单工厂模式,将多个对象的创建逻辑放到一个工厂类中。

当每个对象的创建逻辑都比较复杂的时候,为了避免设计一个过于庞大的简单工厂类,我推荐使用工厂方法模式,将创建逻辑拆分得更

细,每个对象的创建逻辑独立到各自的工厂类中。同理,对于第二种情况,因为单个对象本身的创建逻辑就比较复杂,所以,我建议使

用工厂方法模式。

 

    除了刚刚提到的这几种情况之外,如果创建对象的逻辑并不复杂,那我们就直接通过 new 来创建对象就可以了,不需要使用工厂模式。

 

    现在,我们上升一个思维层面来看工厂模式,它的作用无外乎下面这四个。这也是判断要不要使用工厂模式的最本质的参考标准。

  • 封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。
  • 代码复用:创建代码抽离到独立的工厂类之后可以复用。
  • 隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
  • 控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。

 

参考资料

极客时间--设计模式之美--第44讲,45讲

大数据领域数据建模的多源数据融合技术 在大数据时代,数据来源呈现出多样化的特点,包括企业内部的不同业务系统数据、外部的社交媒体数据、传感器数据等。这些多源数据蕴含着丰富的信息,但由于数据格式、语义、质量等方面的差异,难以直接进行分析和利用。多源数据融合技术的目的就是将这些来自不同数据源的数据进行整合、清洗、关联和统一,构建一个具有一致性和完整性的数据模型,以便更好地挖掘数据背后的价值,为企业决策、科学研究等提供有力支持。 阅读详情

相关推荐

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 814

【设计模式】创建型模式——简单工厂模式

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

小哎呀的博客 1797

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入解析了SAP CO模块中结果分析码KKA2/CJ88的核心应用,通过真实案例详细阐述了如何在成本波动剧烈的销售型项目中,运用结果分析实现收入与成本的精准匹配。文章重点拆解了不同结果分析方法的适用场景与财务影响,并提供了从配置、操作到问题排查的完整实战指南,帮助财务顾问提升项目财务管理能力。

qsc9012345的博客 609

创建型模式-工厂模式

工厂模式将对象的实例化过程封装在一个工厂类中,客户端只需通过调用工厂类的方法来获取所需的对象。它可以有多个不同的具体工厂实现类,每个具体工厂实现类负责创建一组具体的产品。通过使用工厂模式,客户端可以通过调用工厂的方法来创建不同类型的汽车对象,而不需要直接与具体的产品类交互,从而实现了解耦和灵活性。通过使用工厂模式,客户端可以通过调用工厂的方法来创建不同类型的汽车对象,而不需要直接与具体的产品类交互,从而实现了解耦和灵活性。它负责实现抽象工厂中定义的方法,根据客户端的请求来创建具体的产品对象。

xinyi_java的博客 1347

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1023

一文搞懂YOLO各版本差异:v5易用、v8多任务、v10低延迟,该怎么选?

YOLOv5的“易用”是为了降低入门门槛,适合新手启蒙和旧项目维护;YOLOv8的“多任务”是为了满足工业需求,成为目前的主流版本;YOLOv10的“低延迟”是为了适配边缘计算,代表未来的发展趋势。选型的核心不是“选最新的”,而是“选最适合自己场景的”。记住选型口诀,按场景对号入座,就能避开99%的坑。希望这篇文章能帮你彻底搞懂各版本差异,选对属于自己的YOLO版本!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1170

创建型模式之-工厂模式

创建型模式之-工厂模式 简介 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 工厂模式优点 一个调用者想创建一个对象,只需要知道其名称就可以创建; 这种模式具有很高的扩展性,将不同类型的抽象对象交给工厂类完成就行了,增加一个产品随之增加一个工厂类。 工厂模式缺点 在扩展性高的情况下,同时提高了系

shufangreal的博客 381

【RT-DETR创新改进】改进前必看!对Ultralytics调参, 1:1还原RT-DETR官方版本实验参数,使用原汁原味的RT-DETR模型,才能高效跑实验、高效涨点、收割小论文、完成大论文!!!

本文针对Ultralytics训练RT-DETR精度不佳问题,提供参数配置优化方案。通过对比官方RT-DETR参数设置,详细指导如何修改Ultralytics版本的关键参数,包括优化器、学习率、权重衰减等6处配置调整。操作步骤涵盖default.yaml文件修改和trainer.py代码调整,确保模型收敛性能达到官方水平,帮助研究者快速提升实验效果。文末附官方源码链接和具体参数配置网址供参考。

Ai缝合怪、助力小伙伴高效发论文 1781

【创建型设计模式】工厂模式

所有具体产品都必须实现该接口。

2301_79344902的博客 1295

matlab 异常值检测与处理——Robust Z-score法【2024最新版】

博客长期更新,本文最近一次更新时间为:2024年12月9日。

点云侠的博客 1516

【例1896】report all clearance datasets 报告所有间隙数据集

report all clearance datasets 报告所有间隙数据集》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 645

【设计模式】—五大创建型之工厂模式

工厂模式是创建型设计模式,用于封装对象的创建逻辑,将实例化过程与客户端代码解耦。根据场景复杂度,工厂模式分为三种:简单工厂、工厂方法和抽象工厂。答:每个具体工厂(如WindowsFactory)生产一族配套产品(按钮、文本框等),确保这些产品设计风格一致。核心思想:定义一个工厂类,根据输入参数创建不同产品对象。核心思想:提供一个接口,创建相关或依赖对象的家族,而无需指定具体类。答:工厂模式:解耦客户端与具体类,符合依赖倒置原则。缺点:违反开闭原则,新增产品需修改工厂类。

小新阿呆的博客 1723

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

C# 设计模式(创建型模式):工厂模式

工厂模式是创建型设计模式中的重要一环,通过工厂方法,它使得对象的创建与业务逻辑解耦,从而提高了代码的可维护性和可扩展性。在软件设计中,创建型模式是用来创建对象的设计模式,它们帮助我们将对象的创建过程从业务逻辑中分离出来,减少代码的重复性和耦合度。抽象工厂模式是工厂模式的扩展,它提供了一个创建一系列相关或互相依赖的对象的接口,而无需指定具体类。与简单工厂模式不同的是,工厂方法模式是将对象的创建推迟到具体的子类中,每个子类实现一个工厂方法,来创建相应的产品对象。接下来,我们将分别介绍这几种工厂模式。

玉面小浪君的博客 1459

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

创建型模式——抽象工厂模式

创建型模式——抽象工厂模式 (一)简述 抽象工厂模式是一个超级工厂,用来创建其他工厂,这个工厂也被称为工厂的工厂。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。在抽象工厂模式中,接口负责创建相关对象的工厂,而不明确指定它们的类。 每个生成的工厂可以按照工厂模式提供对象。 (二)特点 抽象工厂模式是工厂方法模式的孪生兄弟。工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机等。我们可以把同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在

物是人非,结局始终不美 7175

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

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

【设计模式】简单工厂方法模式(静态工厂方法模式) 创建型模式

/ 运算接口。

weixin_44131922的博客 1822

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

创建型模式 之 简单工厂模式

1.介绍     工厂模式属于创建型的设计模式,通过对对象创建过程的封装与屏蔽且暴露一个统一的对外接口,当内部行为发生改变的时对外部的影响较小。例如在Hibernate 换数据库只需换方言和驱动就可以实现数据库支持的切换,Java的Iterator等都是通过工厂模式实现的。工厂模式分为简单工厂模式和抽象工厂模式,本文主要介绍简单工厂模式。   2. 简单工厂模式类图            ...

houkai的博客 315

创建型模式--简单工厂模式

简单工厂模式定义如下:简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

- 1229

创建型模式——工厂方法模式

创建型模式——工厂方法模式 (一)概述 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method是一个类的实例化延迟到其子类。 在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 (二)模式组成 在工厂方法模式中主要有以下几个角色: 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它

物是人非,结局始终不美 7770

java的23种设计模式02-创建型模式01-工厂方法

创建型模式简介、工厂方法

qq_31532983的博客 934

【创建型模式】工厂模式

本文参考菜鸟教程和ThinkWon的单例模式讲解: 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 主要解决:主要解决接口选择的问题。 何时使用:我们明确地计划不同条件下创建不同实例时。 如何解决

... 178

设计模式——简单工厂模式(创建型)

本文主要介绍了简单工厂模式,包括其定义、结构、实现方式、适用场景、实战示例以及思考。简单工厂模式是一种创建型设计模式,通过工厂类根据参数决定创建哪一种产品类的实例,封装了对象创建的细节,使客户端无需关心具体类的创建逻辑。文章详细阐述了其角色组成、类图、时序图,探讨了两种常见的实现方式,分析了适合与不适合的场景,并提供了 Spring 项目和可插拔式策略工厂的实战示例。最后,还提出了支持 SPI 机制、注解标记策略名称和配置中心切换策略等思考方向。

庄小焱 1596

设计模式,创建型模式之工厂模式

1 概述 创建型模式,提供了一种创建对象的最佳实践。工厂方法模式的核心思想,是通过统一的工厂类来获取对象,而不需要调用类的构造方法。 2 优点 可以将类的实例化过程延缓到子类。调用者无需知道接口/抽象类的具体实现是什么,利用工厂方法即可获取类的实例,降低与调用者的耦合度。 隐藏类的构造细节,降低类创建的复杂度,提高程序可读性。 可以根据不同环境/参数,从工厂构造不同的方法。 3 案例 有一个饭...

Night Field' Blog 161

创建型模式之简单工厂

1、什么是简单工厂? 简单工厂模式是在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。 Tips:简单工厂属于创建型设计模式,但是不属于二十三种设计模式。 2、简单工厂的代码实现 public class SimpleFactory { public Product createProduct(int type) { if (type == 1) { return new ConcreteProduct1();

小z的博客 166

2、创建型模式-工厂模式

工厂模式 工厂模式是Java中最简单最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中创建对象不会对客户端暴露其实现过程,也是构建其他设计模式的基础。 工厂模式优缺点总结 工厂模式优点 工厂模式最重要的功能是隐藏实现,创建对象的时候不会把实现的逻辑暴露给客户端,我们更换更优秀的实现逻辑对客户端是透明的。工厂模式是否有缺点?个人认为工厂模式也是一种基础的构建模型,功能单一专用性强没有必要把其他功能的东西套用给他。 工厂模式使用场景 ...

爱欧米 195

创建型设计模式之工厂方法模式

学习内容来自B站UP主VoidMatrix,内容仅作笔记学习

WDaMu的博客 888
上一篇: 创建型-单例模式
下一篇: 结构型-代理模式
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值