设计模式--工厂方法模式【创建型模式】

ops/2024/12/25 3:05:01/

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式>工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

设计模式–单例模式【创建型模式】

什么是工厂方法模式>工厂方法模式

工厂模式又叫做工厂方法模式>工厂方法模式,是一种创建型的模式,在父类提供一个创建对象的方法,允许子类决定实例化对象的类型,由子类来决定要实例化的是哪一个工厂类,工厂模式让创建对象的过程延迟到子类进行,同时也实现了调用者和实现类解耦,提高了系统的可扩展性和灵活性,这同时也是去掉众多 if else 的实现⽅式。

静态工厂方法模式>工厂方法模式

静态工厂模式通过一个工厂类来创建对象。

静态工厂方法案例

我们假设有小米、小鹏、未来三款车需要制造,车厂是根据起汽车名称来生产汽车的,当前场景可以抽象出如下类。

car 接口

定义了车名称的方法,代码如下:

public interface Car {void carName();
}

XiaoMiCar 类

XiaoMiCar 实现了 Car 接口,代码如下:

public class XiaoMiCar implements Car{@Overridepublic void carName() {System.out.println("car name is xiaomi");}
}

XiaoPengCar 类

XiaoPengCar 实现了 Car 接口,代码如下:

public class XiaoPengCar implements Car{@Overridepublic void carName() {System.out.println("car name is xiaopeng");}
}

WeiLaiCar 类

WeiLaiCar 实现了 Car 接口,代码如下:

public class WeiLaiCar implements Car{@Overridepublic void carName() {System.out.println("car name is weilai");}
}

CarFactory 生产车的工厂类

CarFactory 提供了一个根据车的名称生成 car 的类,代码如下:

public class CarFactory {//根据 car name 创建 car 对象public static Car createCarByName(String carName) {if ("xiaomi".equals(carName)) {return new XiaoMiCar();} else if ("xiaopeng".equals(carName)) {return new XiaoPengCar();} else if ("weilai".equals(carName)) {return new WeiLaiCar();} else {return null;}}}

CarClient

生产 Car 的客户端类如下:

public class CarClient {public static void main(String[] args) {Car xiaomi = CarFactory.createCarByName("xiaomi");xiaomi.carName();Car xiaopeng = CarFactory.createCarByName("xiaopeng");xiaopeng.carName();Car weilai = CarFactory.createCarByName("weilai");weilai.carName();}}

运行 CarClient 执行结果如下:

car name is xiaomi
car name is xiaopeng
car name is weilai

CarClient 类使用 CarFactory 创建出来的具体 Car 实例来实现 Car 的相关功能,这就是简单工厂模式。

可以看到静态工厂(简单工厂)模式代码实现简单,但是添加新的 Car 类型时候需要修改工厂类,对象的创建也是由工厂类来实现的。

工厂方法模式>工厂方法模式

工厂方法模式>工厂方法模式定义了一个用于创建对象的接口,让子类来决定实例化那个类。

Car

车产品属性定义接口如下:

public interface Car {//汽车品牌String getBrand();//汽车创始人String getFounder();//汽车型号String getModel();//汽车颜色String getColor();}

CarFactory

车工厂接口定义如下:

public interface CarFactory {//生产汽车接口Car createCar();}

有了车工厂定义接口,各个车品牌可以实现车工厂接口,也就是具体的车工厂实现类。

XiaoMiCarFactory

小米车工厂实现类如下:

public class XiaoMiCarFactory implements CarFactory{@Overridepublic Car createCar() {return new XiaoMiCar();}
}

XiaoPengCarFactory

小鹏车工厂实现类如下:

public class XiaoPengCarFactory implements CarFactory{@Overridepublic Car createCar() {return new XiaoPengCar();}
}

CarClient

车客户端如下:

public class CarClient {public static void main(String[] args) {XiaoMiCarFactory xiaoMiCarFactory = new XiaoMiCarFactory();Car xiaoMiCar = xiaoMiCarFactory.createCar();String brand = xiaoMiCar.getBrand();String color = xiaoMiCar.getColor();String founder = xiaoMiCar.getFounder();String model = xiaoMiCar.getModel();System.out.println(brand+"--"+founder+"--"+model+"--"+color);XiaoPengCarFactory xiaoPengCarFactory = new XiaoPengCarFactory();Car xiaoPengCar = xiaoPengCarFactory.createCar();String xiaoPengBrand = xiaoPengCar.getBrand();String xiaoPengColor = xiaoPengCar.getColor();String xiaoPengFounder = xiaoPengCar.getFounder();String xiaoPengModel = xiaoPengCar.getModel();System.out.println(xiaoPengBrand+"--"+xiaoPengFounder+"--"+xiaoPengModel+"--"+xiaoPengColor);}}

我们使用小米车工厂类生产小米汽车,使用小鹏车工厂实现类生产小鹏汽车。

执行客户端代码,执行结果如下:

小米--雷布斯--su7--蓝色
小鹏--何小鹏--小鹏P7--炫酷黑

至此工厂方法模式>工厂方法模式已经实现完毕。

思考:工厂方法给我们带来了什么作用呢?

工厂方法的优缺点

优点

  • 将对象的创建过程抽离出来,使得客户端代码可以清晰的表达自己的意图,且可以与具体的车产品类解耦,提高了代码的灵活性和可读性。
  • 定义了统一的工厂类接口,新增车类型只需要,实现统一的工厂类接口即可,易于扩展。
  • 每种车类型都有自己的实现类,新增、修改、删除某个车类型实现类,相互补影响,减少了软件测试成本。

缺点:

  • 工厂方法模式>工厂方法模式需要客户端代码实例化具体的工厂对象,这在一定程度上会导致代码的复杂性和耦合性增加。
  • 工厂方法模式>工厂方法模式会增加应用程序的类的数量,我们每增加一个车类型都需要为创建一个具体工厂。

总结:本篇分享了工厂方法模式>工厂方法模式的使用方法,其中也分析了简单工厂模式,希望可以帮助到有需要的朋友。

如有不正确的地方欢迎各位指出纠正。


http://www.ppmy.cn/ops/144733.html

相关文章

Windows下ESP32-IDF开发环境搭建

Windows下ESP32-IDF开发环境搭建 文章目录 Windows下ESP32-IDF开发环境搭建一、软件安装二、搭建IDF开发环境2.1 安装VS Code插件:2.2 配置ESP-IDF插件:2.3 下载例程源码: 三、编译和烧录代码四、Windows下使用命令行编译和烧录程序4.1 配置环…

Docker安装

目录 1. 联网安装 Docker 2. 离线安装 Docker 3. 安装 Docker Compose 4. 卸载 Docker 和 Docker Compose 1. 联网安装 Docker 在 CentOS 上通过 yum 安装 Docker: # 安装 Docker yum -y install docker # 启动 Docker systemctl start docker # 查看 D…

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本:Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目(URP 3D),点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…

通过Hydra 配置文件实例化Lightning类

通过 Hydra 的配置文件灵活控制 LightningModule、LightningDataModule、Callback 和 Trainer 的实例化过程。 Lightning 与 Hydra 的结合 1. 配置文件结构 一个典型的配置文件目录可能如下: configs/ ├── callbacks/ │ ├── early_stopping.yaml │ ├── che…

亚远景-SO 21434标准下的汽车网络安全:风险评估与管理的关键实践

ISO 21434标准,全称为ISO/SAE 21434 "Road Vehicles - Cybersecurity Engineering",是国际标准化组织(ISO)发布的针对汽车领域的标准,旨在指导汽车制造商、供应商和相关利益相关方在汽车系统中应用适当的网络安全措施。在ISO 21434…

云手机有哪些用途?云手机选择推荐

云手机的使用范围日益扩大,无论是个人使用,还是各种规模的中小型工作室需要进行养号、挂机、参加活动甚至完成各种测试需求,都已经开始大量采用云手机。以前,许多公司或工作室都自行建设手机批量控制的设备,但需要自行…

16_HTML5 语义元素 --[HTML5 API 学习之旅]

HTML5 引入了许多新的语义元素,这些元素有助于创建结构更清晰、更具描述性的网页。语义化 HTML 不仅改善了代码的可读性,还增强了搜索引擎优化(SEO),提高了无障碍访问性,并使得开发者更容易理解和维护代码。…

一文讲明白机器学习、深度学习和人工智能的关系

机器学习和深度学习是人工智能的主流方法技术,两者有区别又有联系。 (1)机器学习 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知…