设计模式之简单工厂模式

termux 安装 rockylinux 往找最新的文件目录,选择ARM版本的image。或者直接查看目录或者国内阿里云镜像,按照cpu架构(安卓9手机一般是aarch64arm最新架构),获取镜像地址,以及checksum里的SHA256信息更新到以下rocky9.sh脚本,如果不需要直接使用即可。 阅读详情

什么是简单工厂模式

    工厂模式是最常用的一类创建型设计模式。它不属于GoF 23种设计模式。它的设计思想很简单,基本流程:         首先将需要创建的不同对象封装到不同的具体产品类中,将公共部分进行抽取后封装到一个抽象产品类中,每一个具体产品类都是抽象产品类的子类。然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品类的方法,该方法可以根据所传入的参数不同创建不同的具体产品对象,客户端只需要调用工厂类的工厂方法。     简单工厂模式是说定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又称为静态工厂方法模式。     简单工厂模式包含以下几个角色:         Factory(工厂角色):即工厂类,是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑。工厂类可以被客户单直接调用创建所需要的产品对象,在工厂类中提供了静态的工厂方法返回抽象的产品类型。         Product(抽象产品角色):工厂类所创建的的所有对象的父类,封装了各种产品对象的公共方法。         ConcreteProduct(具体产品角色):是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,并实现了抽象产品中声明的抽象方法。

简单工厂模式的优缺点

优点
  1. 工厂类包含必要的判断逻辑,可以决定在声明时候创建哪一个产品实例,客户端可以免除直接创建产品对象的职责,简单工厂模式实现了对象的创建和使用的分离。
  2. 客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
缺点
  1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
  2. 使用简单工厂模式必然会增加系统中类的个数,增加了系统的复杂性。
  3. 系统扩展难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂。
  4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成无法形成基于继承的等级结构。

简单工厂模式的应用场景

  1. 工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中的业务逻辑太复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心。

简单工厂模式案例

/**
 * 抽象产品
 */
public interface SweepingRobot {

    void orderRobot();

}

/**
 * 具体产品
 */
public class XiaoMiRobot implements SweepingRobot {
    @Override
    public void orderRobot() {
        System.out.println("购买小米扫地机器人。");
    }
}

/**
 * 具体产品
 */
public class EcovacsRobot implements SweepingRobot {
    @Override
    public void orderRobot() {
        System.out.println("购买科沃斯扫地机器人.");
    }
}

/**
 * 工厂类
 */
public class RobotSimpleFactory {

    public static SweepingRobot orderRobot(Integer brand) {
        switch (brand) {
            case 1:
                return new XiaoMiRobot();
            case 2:
                return new EcovacsRobot();
            default:
                return null;
        }
    }

}

public class Client {
    public static void main(String[] args) {
        SweepingRobot sweepingRobot = RobotSimpleFactory.orderRobot(1);
        sweepingRobot.orderRobot();
    }
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/6ad3c031200948efb86e0985346f9a47.png#pic_center)

简单工厂模式在源码中的应用

Calendar

/**
 * Calendar 是抽象产品,也充当了工厂类
 **/
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
    /**
     * Converts the current calendar field values in {@link #fields fields[]}
     * to the millisecond time value
     * {@link #time}.
     *
     * @see #complete()
     * @see #computeFields()
     */
    protected abstract void computeTime();

    private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        CalendarProvider provider =
            LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                                 .getCalendarProvider();
        if (provider != null) {
            try {
                return provider.getInstance(zone, aLocale);
            } catch (IllegalArgumentException iae) {
                // fall back to the default instantiation
            }
        }

        Calendar cal = null;

        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
        if (cal == null) {
            // If no known calendar type is explicitly specified,
            // perform the traditional way to create a Calendar:
            // create a BuddhistCalendar for th_TH locale,
            // a JapaneseImperialCalendar for ja_JP_JP locale, or
            // a GregorianCalendar for any other locales.
            // NOTE: The language, country and variant strings are interned.
            if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                cal = new BuddhistCalendar(zone, aLocale);
            } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                       && aLocale.getCountry() == "JP") {
                cal = new JapaneseImperialCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        }
        return cal;
    }
    ......
}

/**
 * 具体产品
 **/
class JapaneseImperialCalendar extends Calendar {
    protected void computeTime() {
        // In non-lenient mode, perform brief checking of calendar
        // fields which have been set externally. Through this
        // checking, the field values are stored in originalFields[]
        // to see if any of them are normalized later.
        if (!isLenient()) {
            if (originalFields == null) {
                originalFields = new int[FIELD_COUNT];
            }
            for (int field = 0; field < FIELD_COUNT; field++) {
                int value = internalGet(field);
                if (isExternallySet(field)) {
                    // Quick validation for any out of range values
                    if (value < getMinimum(field) || value > getMaximum(field)) {
                        throw new IllegalArgumentException(getFieldName(field));
                    }
                }
                originalFields[field] = value;
            }
        }
        ......
    }
    
}

/**
 * 具体产品
 **/
public class GregorianCalendar extends Calendar {
    protected void computeTime() {
        // In non-lenient mode, perform brief checking of calendar
        // fields which have been set externally. Through this
        // checking, the field values are stored in originalFields[]
        // to see if any of them are normalized later.
        if (!isLenient()) {
            if (originalFields == null) {
                originalFields = new int[FIELD_COUNT];
            }
            for (int field = 0; field < FIELD_COUNT; field++) {
                int value = internalGet(field);
                if (isExternallySet(field)) {
                    // Quick validation for any out of range values
                    if (value < getMinimum(field) || value > getMaximum(field)) {
                        throw new IllegalArgumentException(getFieldName(field));
                    }
                }
                originalFields[field] = value;
            }
        }
    }
    ......
}
 
![在这里插入图片描述](https://img-blog.csdnimg.cn/69d8ab1f27e34987b1af42b0f08ae103.png#pic_center)
【数学基础】基于欧拉角表达的旋转顺序 欧拉角旋转顺序 阅读详情

相关推荐

Arduino智能小灯DIY:人体感应+光线感应+蓝牙控制全攻略(附完整代码)

本文提供了一份完整的Arduino智能小灯DIY制作指南。项目融合了人体感应、光线感应与蓝牙控制三大功能,通过详细的硬件清单、电路连接图、核心逻辑讲解及附带的完整代码,手把手教你打造一个能自动感知环境与人、并支持手机远程控制的智能照明装置,是入门智能家居和物联网开发的绝佳实践。

java5的博客 1094

「聊设计模式」之简单工厂模式(Simple Factory)

简单工厂模式属于创建型模式,它提供了一种创建对象的方式,将对象的创建过程封装在工厂中,客户端只需要调用工厂的创建方法即可得到所需对象。简单工厂模式可以根据传入参数的不同返回不同的对象实例,这种方式属于静态工厂方法,因为它使用了静态方法来创建对象。

**My Coding Family** 1007

系统设计---算法与架构

这片文章对系统设计的具体步骤及相关知识进行介绍,主要分为四部分:算法设计、IC系统架构设计、基于systemC的IC系统设计、系统设计工具SPW简介。 (一)算法设计 系统设计的第一步是给出清晰的系统规范,该规范写明了系统的功能、性能、费用、开发时间等。接下来创建一个系统行为模型,并且可以用来初步验证设计的性能。再下来,对行为模型进行细化,即进行算法设计。算法设计大致分为三步: 1)给出浮点

正在努力的ICer的博客 4373

设计模式之工厂模式

工厂模式 1、简单工厂模式 1.1、定义 简单工厂模式(Simple Factory Pattern)是指有一个工厂对象决定创建出哪一种产品类的实例,不属于23种设计模式。 简单工厂是产品的工厂 1.2、应用场景 简单工厂模式适用于工厂类创建的对象较少的场景,且客户端只需要传入工厂参数,对如何创建对象的逻辑不需要关心。 1.3、缺点 工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背了开闭原则。 不易于扩展过于复杂的产品结构。 1.4、实例 支付接口规范: public interface

aaa31203的博客 16万+

【CAPL实用开发】--- 使用VN1640A测试Busoff快慢恢复

使用VN1640A测试Busoff快慢恢复,包含具体的CAPL代码实现。

LabVIEW、CAPL、python、车载以太网等学习分享,文章正在写 2093

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

设计模式(一)—— 简单工厂模式(定义、案例分析、特点、缺点)

文章目录前言正文一、定义二、情景假设三、情景分析四、模式结构及分析模式结构模式分析模式特点模式缺点五、使用情景总结 前言 文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。 提示:一些设计模式的英文单词是有必要记住的噢~ 这在日后接触到各类模式代码的时候也能很快的反应过来,在我们编写各类模式的时候也能按照相应英文单词编写,既方便别人阅读也是方便了自己的阅读理解。 本篇文章针对的是设计模式中的工厂方法模式以及抽象工厂模式两大创建型模式的前导小课程学习-

weixin_43905387的博客 1729

万字长文解密:SAP Fiori 首屏加载缓慢背后的真相

什么是一个健康理想的 Fiori 首次加载状态?FLP 首页不臃肿,用户默认看见的内容不多但足够用缓存作业按规则运行,冷启动不至于每次都从零开始应用首屏只读必要数据,UI5 资源经过 preload,视图异步加载OData 服务字段克制、分页合理、缓存分层清楚后台 CDS 与 HANA 只为当前屏幕做最必要的工作。只要这些标准同时满足,用户第一次打开 Fiori 页面的体感通常会从明显卡顿变成可接受甚至顺滑。

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

设计模式——简单工厂模式

设计模式——简单工厂模式

qq_67693066的博客 1248

最新Codex接入DeepSeek官方API教程(无需cc-switch)

最新Codex接入DeepSeek官方API教程(无需cc-switch)

猿小白的博客 937

微信小程序一键跳转公众号(使用 official-account 组件)

在当今移动互联网时代,用户体验已成为应用成功的关键因素之一。微信小程序作为一种便捷的应用形式,广泛应用于各个行业,为用户提供了丰富的服务和信息。然而,如何进一步提升用户体验,使其在小程序中能够更方便地获取相关信息,成为开发者需要关注的重要课题。实现一键跳转到公众号的功能,正是一个有效的解决方案。通过这一功能,用户可以轻松访问公众号,获取更多内容和服务,从而增强与品牌的互动和粘性。本文将详细介绍如何在微信小程序中实现这一功能,并提供相关的操作步骤和注意事项。

不迁怒,不贰过。小知识,大智慧。 3127

设计模式系列(四)简单工厂模式(Simple Factory Pattern/Static Factory Method)

设计模式系列(四)简单工厂模式 (Simple Factory Pattern/Static Factory Method)     简单工厂模式又被成为静态工厂方法,所以其外文名一般是Static Factory Method。其属于创建型模式,本质上并不属于23种GOF设计模式之一,这种模式可以称之为一种编程习惯,算是一种比较良好的设计习惯。那么什么是简单工厂设计模式呢?从概念上来

君临天下的博客 1086

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 306

秒懂设计模式之简单工厂模式(Simple Factory Pattern)

前言 人在IT江湖飘,不懂设计模式咋装逼? 定义 使用场景 实现 public abstract class Shape { public abstract void draw(); } public class Rectangle extends Shape { @Override public void draw() { System.out.prin...

ShuSheng007的程序人生 2126

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 设计模式之静态工厂方法模式

静态工厂方法模式,又称为简单工厂模式,是最简单最易理解的工厂模式,本文通过一个 “月饼” 例子,一起来学习下这种设计模式吧!

牛角尖 2442

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式-简单工厂模式(Simple Factory Pattern)

简单工厂模式 定义 设计一个工厂类,给工厂类传入参数决定创建哪一种产品类的实例。 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。 类型 创建型,但不属于GOF23种设计模式。 适用场景 应用层只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不需要关心。 优点 只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节。 缺点 工厂类的职责相对过重,不易维护,增加新的产品可...

kaven 5132

廖雪峰Python教程[完整版]

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

JAVA设计模式之 简单工厂模式【Simple Factory Pattern】

一、概述 er、适用场景

小吕丶Code阶区 5319

深入理解设计模式-简单工厂模式(静态工厂方法模式)

文章目录一、定义二、使用场景三、代码样例1.需求2.类图3.运算操作类4.操作工厂类5.客户端类四、优缺点结尾 一、定义 简单工厂模式是属于创建型模式,在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 二、使用场景 工厂类负责创建的对

少说,多做 1万+

【设计模式】——简单工厂模式(Simple Factory Pattern)

简单工厂模式又称为静态工厂方法模式,它定义了一个工厂类,这个类根据传入的参数不同返回不同类的实例。这些实例通常都具有共同的父类或接口。简单工厂模式的核心在于将对象的创建逻辑封装在工厂类中,客户端通过调用工厂类的静态方法来获取所需的对象,而无需直接实例化具体产品类。

J^T的博客 1758

C#设计模式读书笔记之简单工厂模式(Simple Factory Pattern)

简单工厂模式(Simple Factory Pattern)【使用频率:★★★☆☆】 1. 概述:   将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到 2. 模式中的角色   2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法。   2.2 抽象产品(Product):定义简单工厂中要返回的产品。   2...

qq826364410的专栏 350

Java 设计模式-简单工厂模式

Java 设计模式-简单工厂模式 文章目录Java 设计模式-简单工厂模式介绍简单工厂模式的结构与实现**简单工厂模式的优缺点和适用环境** 介绍 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具

霍英俊 2513

嵌入式系统接口技术全解析:从UART到CAN

嵌入式开发的核心之一在于硬件接口——设备间如何通过特定时序和电平完成可靠通信。UART、I2C、SPI、CAN等接口看似简单,却直接决定系统的稳定性与实时性。理解它们的原理、差异和适用场景,是选型与调试的基础,也是从裸机走向RTOS和Linux的关键技能。在传感器采集、工业控制、物联网节点等典型应用中,接口设计总是交织着启动流程、存储映射、中断调度和电路细节,一个上拉电阻或极性配置都可能造成通信失败。以实战经验串联起嵌入式系统的知识框架,详细拆解常用接口的选型理由、常见坑点与排查方法,帮助开发者建立从物理层

weixin_34408624的博客 160

【设计模式】简单工厂模式(Simple Factory Pattern)Go 实例

该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,UML 类图如下: 下面我们使用汽车生产来讲解该模式: package factory import "fmt" // 声明 Car 标准接口 // 包含 setName、getName 和 drive 方法 type Car interface { setName() getName() drive() } // 声明 BydCar type BydCar st

lightserver.cn 1万+

设计模式-简单工厂模式/静态工厂方法(Static Factory Method)

定义 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 优点 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工

Robert学习分享 2395

Java设计模式之简单工厂模式

简单工厂模式(SimpleFactory)是类的创建模式,又叫做静态工厂方法模式,是最基本的设计模式。由一个工厂对象决定创建出哪一种产品的实例,三个重要的角色,工厂类、目标类抽象接口、目标对象类;工厂类包含静态的工厂方法。 伪代码 package testdaemo.bean; import org.springframework.util.Assert; /** * 简单工厂模式...

Mrmamenghui的博客 273

设计模式—— 简单工厂模式(Simple Factory Pattern)

简单工厂模式简单工厂模式1、背景2、定义3、特征4、应用参考 简单工厂模式 1、背景 我开一家披萨店,当客户需要某种披萨并且我这家店里也能做的时候,我就会为其提供所需要的披萨(当然是要钱的哈哈),如果其所需的我这没有,则是另外的情况,后面会谈。这时候,我这家 披萨店就可以看做工厂(Factory),而生产出来的披萨被成为产品(Product),披萨的名称则被称为参数,工厂可以根据参数的不同返回不同的产品,这就是简单工厂模式。 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一

JMW1407的博客 9788
上一篇: 设计模式之建造者模式
下一篇: 设计模式之单例模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值