设计模式之工厂方法模式

写在前面

本文看下工厂方法设计模式。

1:介绍

1.1:什么时候用工厂方法

当我们有若干个种类的对象需要创建,且随着业务的发展,要创建的对象的种类还会不断变化,此时可以考虑使用工厂方法设计模式。

1.2:UML类图

工厂方法设计模式,包含如下元素:

1:抽象工厂类工厂类的抽象,定义一个用于生产对象的方法。
2:具体工厂类继承抽象工厂类,用于生产具体的某项类型的对象(产品)。
3:产品类需要被创建的类。
4:客户端客户端根据需要使用对应的具体工厂类来创建具体的产品(对象)。

如下图:

在这里插入图片描述

2:实例

源码 。

2.1:场景

分别需要生产自行车,汽车,飞机,这三类产品。

2.2:程序

  • 定义3个具体产品类(包括接口的话4个)
public interface Vehicle {void sayHi();
}public class Plane implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}public class Car implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}public class Bicycle implements Vehicle {@Overridepublic void sayHi() {System.out.println("hi from " + this.getClass().getSimpleName());}
}
  • 定义抽象工厂类
public abstract class AbstractVehicleFactory<T> {//    abstract <T> T makeProduct();public abstract T makeProduct();
}
  • 定义自行车工厂类
public class BicycleFactory extends AbstractVehicleFactory<Bicycle> {@Overridepublic Bicycle makeProduct() {return new Bicycle();}
}
  • 定义汽车工厂类
public class CarFactory extends AbstractVehicleFactory<Car> {@Overridepublic Car makeProduct() {return new Car();}
}
  • 定义飞机工厂类
public class PlaneFactory extends AbstractVehicleFactory<Plane> {@Overridepublic Plane makeProduct() {return new Plane();}
}

2.3:测试

public class FactoryTest {public static void main(String[] args) {// 生产自行车AbstractVehicleFactory<Bicycle> bicycleAbstractVehicleFactory = new BicycleFactory();bicycleAbstractVehicleFactory.makeProduct().sayHi();// 生产汽车AbstractVehicleFactory<Car> carAbstractVehicleFactory = new CarFactory();carAbstractVehicleFactory.makeProduct().sayHi();// 生产飞机AbstractVehicleFactory<Plane> planeAbstractVehicleFactory = new PlaneFactory();planeAbstractVehicleFactory.makeProduct().sayHi();}
}

运行:

hi from Bicycle
hi from Car
hi from PlaneProcess finished with exit code 0

这样当有新的产品时,只需要提供对应的工厂类即可。另外,当我们需要创建的不是一个产品,而是一组需要系统工作的产品时,工厂方法就不行了,需要考虑抽象工厂设计模式。

写在后面

参考文章列表

简单工厂模式、工厂方法模式与抽象工厂模式总结 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux开发实操(五):embedded linux嵌入式Linux开发

前言: embedded linux开发有个好处就是开源的,总的来说涉及五个部分: 1、工具链Toolchain:为目标设备创建代码需要的编译器和其他工具。其他一切都取决于工具链。 2、引导程序Bootloader:它初始化板并加载Linux kernal。 3、内核kernal:这是系统的core核心,管理系统…

macOS 怎么安装redis数据库

1 访问redis数据库下载网址 http://download.redis.io/releases/ 访问上述的redis下载的网址&#xff0c;确定你想要的版本 然后下载即可 &#xff08;我选则的是6.2.6&#xff09; 然后下载 下载后 把这个文件解压&#xff0c;放在自己想要放在的位置 2 打开终端 输入对应的…

【C/C++练习】经典的排列组合问题(回溯算法)——电话号码的字母组合

&#x1f4d6;题目描述 题目出处&#xff1a;电话号码的字母组合 示例&#xff1a; &#x1f4d6;题解  这是一道典型的排列组合问题&#xff0c;根据输入&#xff0c;我们需要找到所有的组合。下面以输入字符串digits "23"为例来讲解这道题目。 图解&#xff1…

GEE入门学习,遥感云大数据分析、管理与可视化以及在林业应用丨灾害、水体与湿地领域应用丨GPT模型应用

目录 ①海量遥感数据处理与GEE云计算技术实践应用 ②GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用 ③GEE遥感云大数据林业应用典型案例实践及GPT模型应用 ④遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 ①海量遥感…

Java利用POI导入Excel数据(多个sheet、模板)

需求&#xff1a;根据excel模板导入数据 sheet1&#xff1a;1-6行为固定格式&#xff0c;且需要取值({xxx});7行开始为数据集合(list) sheet2&#xff1a;都为固定格式&#xff0c;取值地方&#xff1a;{xxx} 1、数据格式&#xff08;两个Sheet&…

TortoiseGit 入门指南06:解决冲突

上节讲到 拉取 &#xff08;pull&#xff09;&#xff0c;说到&#xff1a; 拉取不仅将数据下载到你的本地版本库&#xff0c;还会自动合并。 在合并期间&#xff0c;将更新工作区文件以反映合并结果。如果合并文件的同一区域被多方更改&#xff0c;就会产生冲突。Git 不能随机…

[微信小程序] movable-view 可移动视图容器 - 范围问题

movable-view 可移动视图容器 可移动视图容器&#xff0c;在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中&#xff0c;并且必须是直接子节点 <view><movable-area style"width: 750rpx;height: 200rpx;background-color: gainsboro;">&l…

4.postgresql--rollup,grouping sets,cube

PostgreSQL ROLLUP 是group by 的子句&#xff0c;是生成多个分组集合的快捷功能。与Cube子句的差异是&#xff0c;rollup 不生成基于特定列所有可能的分组集合&#xff0c;生成分组集合为其子集。 ROLLUP假设输入列之间存在层次结构&#xff0c;从而生成有意义的所有分组集合…

Vue3---什么是路由缓存问题

使用带有参数的路由时需要注意的是&#xff0c;当用户从 /users/johnny 导航到 /users/jolyne 时&#xff0c;相同的组件实例将被重复使用。因为两个路由都渲染同个组件&#xff0c;比起销毁再创建&#xff0c;复用则显得更加高效。不过&#xff0c;这也意味着组件的生命周期钩…

机器学习洞察 | 分布式训练让机器学习更加快速准确

机器学习能够基于数据发现一般化规律的优势日益突显&#xff0c;我们看到有越来越多的开发者关注如何训练出更快速、更准确的机器学习模型&#xff0c;而分布式训练 (Distributed Training) 则能够大幅加速这一进程。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源…

1130 - Host XXX‘ is not allowed to connect to this MySQL server

mysql 连接报错 这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有没有用户 解决的方法&#xff1a; 登入mysql后&#xff0c;更改 “mysql” 数据库里的 “user” 表里的 “host” 项&#xff0c;从”localhost”改称’%’。 1、连接服务器: mysql -u root -p…

性能测试持续学习 Docker 新建镜像,启动 POD

目录 前言&#xff1a; 1、构建镜像 2、使用已有镜像启动 Pod 前言&#xff1a; 在进行性能测试时&#xff0c;持续学习Docker的使用可以帮助测试团队更好地管理测试环境和资源。通过使用Docker&#xff0c;可以轻松创建和管理测试环境的镜像&#xff0c;并通过启动POD来快…