白话设计模式之工厂方法模式

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南 官网:www.SZLCSC.COM以芯片为例器件类——>芯片类——>对应芯片确定芯片——>数据手册1:原理图2:PCB3:打开操作流程选中原理图——>文件——>导出——>AD1: ✔2:导出AD文件操作流程选中PCB图——>文件——>导出——>AD1: ✔2:导出AD文件1:PCB图2:原理图操作流程文件——>打开操作流程选中文件——>打开操作流程项目文件——>添加新的...到工程——>Schematic Library新原理图库操作流程项目文件——>添加新的...到工程——>PCB Library新的PC 阅读详情

在游戏中有很多房子、车子模型,玩的时候就想难道这些都是直接用new的方式创建出来的吗?不太可能,直接用new的话,开发游戏场景的时候工程师还需要关心房子创建的具体细节,比较影响工作效率,所以我更倾向于认为他们使用了工厂方法模式在管理模型的创建。

简单工厂模式

如果要创建白色房子和红色房子该怎么设计呢?并且要便于管理。

我最初的想法是:创建一个工厂类,然后根据调用方传入的参数判断是new个白房子还是new个红房子返回。

但是房子都是有共性的,比如它们都要有展示功能,所以可以作为约束放到抽象基类中。

UML类图如下:

publicabstractclassAbstractHouse{
    /**
     * 创建房子
     *
     * @param locationX 横向坐标
     * @param locationY 纵向坐标
     * @param angle:角度
     */publicabstractvoidshow(double locationX, double locationY, double angle);
}

publicclassRedHouseextendsAbstractHouse{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("红色房子展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}

publicclassWhiteHouseextendsAbstractHouse{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("白色房子展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}
publicclassHouseFactory{
    public AbstractHouse createHouse(String houseName){
        switch (houseName) {
            case"白房子": returnnew WhiteHouse();
            case"红房子": returnnew RedHouse();
            default: returnnull;
        }
    }
}
publicclassHouseClient {publicstaticvoidmain(String[] args){
        AbstractHouse whiteHouse = new HouseFactory().createHouse("白房子");
        whiteHouse.show(32, 60, 1);
        System.out.println("-------------------------------");
        AbstractHouse redHouse = new HouseFactory().createHouse("红房子");
        redHouse.show(122, 545, 35);
    }
}

运行打印出来的结果如下:

这样一个HouseFactory就可以管理所有房子模型的创建了,如果要新加一种房子,也只需要在HouseFactory中增加一种switch case就行了,如果你希望HouseFactory是全局共享的,还可以把createHouse改成静态方法。

但是这种结构不容易扩展,比如要求再增加对车辆的创建管理,该如何做呢?咱们的工厂方法模式就开始发挥作用了。

工厂方法模式

如果要对车子和房子统一进行管理,在coding之前,可以先捋下思路。

首先需要对模型做抽象:

白房子红房子需要一个共同的抽象父类

摩托车吉普车也需要一个共同的抽象父类(这里为了突出工厂分离的必要性,单独为车辆增加了一种“速度”的属性)

它们的抽象父类还可以做一层抽象,是所有模型的抽象父类。

然后对抽象工厂做设计:

房子的创建需要一个工厂

车辆的创建也需要一个工厂

它们之上可以加层抽象父类,是所有模型工厂的抽象父类。

UML类图如下:

/**
 * 抽象模型实体
 */publicabstractclassAbstractModel{
    publicabstractvoidshow(double locationX, double locationY, double angle);
}
/**
 * 抽象房子实体
 */publicabstractclassAbstractHouseextendsAbstractModel{

}

/**
 * 红房子实体
 */publicclassRedHouseextendsAbstractHouse{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("红色房子展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}

/**
 * 白房子实体
 */publicclassWhiteHouseextendsAbstractHouse{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("白色房子展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}
/**
 * 抽象交通工具实体
 */publicabstractclassAbstractVehicleextendsAbstractModel{
    /**
     * 速度
     */publiclong speed;
}

/**
 * 摩托车实体
 */publicclassMotorcycleVehicleextendsAbstractVehicle{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("以" + speed + "迈速度飞驰的摩托车展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}

/**
 * 吉普车实体
 */publicclassJeepVehicleextendsAbstractVehicle{
    @Overridepublicvoidshow(double locationX, double locationY, double angle){
        System.out.println("以" + speed + "迈速度飞驰的吉普车展示完成。展示效果:横向坐标:" + locationX + " 纵向坐标:" + locationY + " 角度:" + angle);
    }
}
/**
 * 模型的抽象工厂
 */publicabstractclassAbstractModelFactory{
    publicabstract AbstractModel createModel(String modelName);
}

/**
 * 房子的加工工厂
 */publicclassHouseFactoryextendsAbstractModelFactory{
    @Overridepublic AbstractHouse createModel(String modelName){
        switch (modelName) {
            case"红房子":
                returnnew RedHouse();
            case"白房子":
                returnnew WhiteHouse();
        }
        returnnull;
    }
}

/**
 * 交通工具的加工工厂
 */publicclassVehicleFactoryextendsAbstractModelFactory{

    @Overridepublic AbstractVehicle createModel(String modelName){
        switch (modelName) {
            case"吉普车": returnnew JeepVehicle();
            case"摩托车": returnnew MotorcycleVehicle();
        }
        returnnull;
    }

    /**
     * 常见携带速度的交通工具
     */public AbstractVehicle createModelWithSpeed(String modelName, long speed){
        AbstractVehicle vehicle = createModel(modelName);
        if(vehicle != null) {
            vehicle.speed = speed;
        }
        return vehicle;
    }
}
publicclassModelClient {publicstaticvoidmain(String[] args){
        HouseFactory houseFactory = new HouseFactory();
        VehicleFactory vehicleFactory = new VehicleFactory();
        try {
            houseFactory.createModel("白房子").show(3, 2, 5);
            houseFactory.createModel("红房子").show(41, 24, 12);
            System.out.println("-------------------------------");
            vehicleFactory.createModelWithSpeed("摩托车", 233).show(233, 45, 1);
            vehicleFactory.createModelWithSpeed("吉普车", 76).show(345, 234, 32);
        } catch (Exception e) {
            System.out.println("模型未找到");
        }
    }
}

打印结果:

优势:

工厂方法模式的优势就像前面提到的统一管理模型的创建,使调用方更加专注于业务,调用时只需要传入一个key(即demo中的modelName),不需要知道对象创建的过程,降低了模块间耦合度。

劣势:

需要创建工厂类,增加文件数目,没有直接new那么方便。结构设计上不符合开闭原则,每增加一种模型都更改具体工厂中增加一种switch case。

在上文的提到的例子中,需要在工厂里switch case判断创建哪种对象,在大型项目中可以通过泛型、注解等方式解耦,如果大家感兴趣,我后面会专门出一个文章,讲下如何解耦。此外,在复杂业务中,比如房子的类型有几十个,如果全放到一个工厂里制造,会显得特别繁重,这时需要根据房子特征更细粒度的拆分,甚至可能一个工厂对应一种模型。设计模式可以有各种变种,在工作中需要大胆尝试,找到最适合业务的那种。

【教程4>第2章>第19节】 GMSK解调系统的FPGA开发与matlab对比验证 MSK(Minimum Shift Keying,最小频移键控)和GMSK(Gaussian Minimum Shift Keying,高斯最小频移键控)都是数字调制技术,主要用于无线通信系统中将数字信号转换为模拟信号进行传输。它们都是连续相位移键控(Continuous Phase Shift Keying, CPK)的一种形式,意味着相邻码元之间没有相位跳变的突变,而是连续过渡,这有助于减少信号带宽和降低邻道干扰。GMSK的解调过程与MSK类似,我们这里还是采用和MSK解调一样的1bit解调方法。 阅读详情

相关推荐

[Unity实战]热更新如何预防过度裁剪

假设你现在有一个游戏客户端,客户端只打包了入口场景,游戏场景都存放在了AB包。

u012587406的博客 1605

简单工厂模式重构Switch语句

场景 最近看公司的代码,经常看到很多的switch语句,想到如果要加case改动比较大,代码也比较长,违反了开闭原则,所以想着用简单工厂重构下,方便以后的扩展。 原代码 private void dealMessage(int type) { //对消息类型分类处理 switch (type) { //客户端心跳报文 -0 case HEART_B...

qq_34978273的博客 1590

机器人控制入门

机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位

彼岸花 1万+

【重构】使用简单工厂模式重构Switch语句

Code Smell:Switch Statements Switch语句的问题在于,一旦有新case出现,Switch语句块就要加上这条case。如果Switch语句块很多且散布在不同的地方,找到并修改它们将是非常恐怖的事

Sarah的博客 7688

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 227

【ENVI初学】查看影像空间分辨率及重采样

例如,如果线段长度为900米,对应的像素数量为30个,那么影像的空间分辨率为30米。通过计算长度与像素数量的比值,即可得到影像的空间分辨率。,在弹出的对话框中,输入重采样后输出文件的xy分辨率大小。在测量结果窗口中,可以看到该线段的长度以及角度。在影像上点击并拖动鼠标,绘制一条直线段。工具,选择要重采样的影像后点击ok。,避免了插值过程中光谱信息的改变。:最近邻插值法通过选择原始影像中。在ENVI中打开影像后右键选择。指示了每个像素的地理跨度(聚合为一个新像素,通常通过。方法一:查看影像的元数据。

weixin_41619112的博客 5571

工厂模式之消除switch/case语句

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34242331的博客 846

kubeadm init 运行时kebelet启动失败问题

解决k8s kubeadm init时遇到的kubelet问题

ZDPZN的博客 6074

白话设计模式之工厂方法模式:对象创建的智慧之道

大家好,软件开发的学习过程中,设计模式是提升编程能力的关键,但理解和运用这些模式却并不容易。我在学习时也遇到过不少困难,所以特别希望通过这篇文章,和大家一起深入探讨工厂方法模式,在交流中共同进步,让设计模式的学习变得轻松一些。

wj_rdk的博客 1702

大模型-高通平台性能测试示例-2

在QNN中,可以使用(genis-t2t-run)和这两个工具来进行推理的性能分析。支持在QNX操作系统或Android操作系统上进行性能分析。:提供基本的性能数据,如运行时间、资源消耗等。:提供更详细的性能数据,可能包括各个操作的执行时间、资源使用情况等。:是指在性能分析的同时进行代码质量检查,以发现潜在的问题。:是指跟踪和分析神经网络中各个操作的性能,以优化网络结构或参数。

点滴的岁月 1493

Qt入门教程100篇(已完结)

Qt5入门教程,Qt6入门教程。包含了: Qt环境搭建篇、Qt数据类型篇、Qt中STL篇、Qt核心篇、Qt核心对象QObject篇、Qt基础控件篇、Qt对话框篇、Qt高级控件篇、Qt数据模型篇、QSS篇、Qt文件篇 、Qt硬件编程、Qt的一些demo、Qt项目开发篇。......

小鱼酱的博客 15万+

白话设计模式之工厂方法模式:创建对象的巧妙之道

大家好!在技术学习的道路上,我始终觉得分享能让我们进步得更快。写这篇博客,就是希望能和大家一起深入探索设计模式的奇妙世界,今天咱们来聊聊工厂方法模式。它在软件开发中有着独特的作用,能帮我们更优雅地创建对象。接下来,我会结合实际例子,用通俗易懂的语言,带大家深入了解这个模式。

wj_rdk的博客 1490

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1056

白话设计模式之工厂方法模式:编程世界的对象创建智慧

大家好,在软件开发的学习过程中,设计模式是提升编程能力的关键,但这些模式的概念和应用往往让人摸不着头脑。我也在不断学习和探索,所以希望通过这篇文章,和大家一起深入研究工厂方法模式,在交流和分享中共同进步,让设计模式不再是我们学习路上的“拦路虎”。

wj_rdk的博客 1674

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【白话设计模式】去哪儿网一面:工厂方法模式

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来PDF文档。

2401_85407056的博客 407

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

白话设计模式_工厂模式之工厂方法模式

        简单工厂虽然对产品生产提供了非常好的封装,但并没有遵循面向对象设计的”开放-关闭原则“,工厂方法模式可解决这个问题。          “开放-关闭原则”:对扩展开放、对修改关闭。什么意思呢?我的理解是:当我们要扩展新功能时,不需要修改原来的代码,简单的添加某个类、或继承某个抽象类、或实现某个接口就可以完成。          再看上篇中SimpleFactory这...

tgwiloveyou的专栏 248

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

白话设计模式之工厂方法模式:对象创建的高效“工厂”

大家好,软件开发的学习之旅充满挑战,设计模式作为其中的关键内容,常常让不少开发者感到困惑。我在学习过程中也遇到过很多难题,所以希望通过这篇文章,和大家一起深入探索工厂方法模式,在交流中共同进步,让设计模式不再那么难以理解和应用。

wj_rdk的博客 1200

白话设计模式之工厂方法模式:对象创建的“智慧魔法棒”

大家好!在技术学习的道路上,我一直相信分享能让我们收获更多。今天,咱们来深入探索设计模式中的工厂方法模式,它就像代码世界里的一根“智慧魔法棒”,能让对象的创建变得更加灵活、高效。希望通过这篇博客,能帮助大家轻松理解并掌握这个强大的设计模式。

wj_rdk的博客 1618

白话设计模式之工厂方法模式:软件开发的“对象制造工厂”

大家好。在软件开发的学习道路上,设计模式是一块难啃但又极其重要的“骨头”。学习过程中,各种概念和模式的应用场景常常让人摸不着头脑。所以,我希望通过这篇文章,和大家一起深入研究工厂方法模式,在交流中共同进步,让设计模式不再成为我们学习路上的“绊脚石”。

wj_rdk的博客 1110

【白话设计模式五】工厂方法模式(Factory Method)

为什么80%的码农都做不了架构师?>>> ...

weixin_34029680的博客 135

大白话说Java设计模式-04-工厂方法模式(业务实战篇)

本文结合支付渠道对接的业务场景详解工厂方法模式的核心实现与实战应用,讲解工厂方法模式的四大核心角色(抽象产品、具体产品、抽象工厂、具体工厂)的设计思路,对比简单工厂、工厂方法、抽象工厂三种模式的适用场景差异,分析工厂方法模式在Spring、MyBatis等框架中的应用案例,帮助开发者掌握如何在业务中灵活运用工厂方法模式解耦对象创建逻辑。

Java后端 | AI智能体应用实战派 | 电脑技能行家 372

大白话说Java设计模式-05-工厂方法模式(源码剖析篇)

本文从JDK、Spring、中间件源码角度深度剖析工厂方法模式的工业级实现,详解JDK集合框架、Spring Bean工厂、Dubbo SPI扩展点加载、MyBatis SqlSession工厂等场景下工厂方法模式的设计思路与实现逻辑,对比不同框架中工厂方法的适配改造方案,帮助读者理解工厂方法模式在源码中的灵活应用,掌握如何在业务开发中借鉴框架级设计思路。

Java后端 | AI智能体应用实战派 | 电脑技能行家 260

Java设计模式详解之一工厂方法模式

设计模式(Design Patterns)——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设

码农六子 350

大白话系列:常见的设计模式(上)

大白话给你解释Java常见的设计模式(创建型)~

2401_87403086的博客 1954

23种设计模式总结(大白话,适合小白)

23种设计模式总结,文字不生硬,举例易理解

一只向入研坑的程序猿 8000

23种设计模式

public static void send(User user, String msg) { /* 转发消息 */ }System.out.println(type + "子弹发射到(" + x + "," + y + ")");public void deliver() { System.out.println("陆运");System.out.println("书的价格:" + book.getPrice());System.out.println("微信支付:" + amount + "元");

qq_59463944的博客 9932
上一篇: 太顶了!阿里技术官甩出的内部分布式系统开发笔记秒杀市面大部分分布式资料
下一篇: Java面试必背八股文,1000多道最新大厂架构面试题,赶紧收藏起来吧!
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值