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

server/2024/10/10 20:20:18/

工厂方法模式(Factory Method Pattern)
一种创建型设计模式,它定义了一个用于创建对象接口,让子类决定将哪一个类实例化,从而将产品的实例化推迟到子类中。这种模式的主要角色包括:

角色1:抽象工厂(Abstract Factory)。它是工厂方法模式的核心,与应用程序无关,提供了创建产品的接口
角色2:具体工厂(Concrete Factory)。它是实现抽象工厂接口的具体工厂类,负责创建具体的产品对象。
角色3:抽象产品(Product)。它是所有对象的超类,定义了产品的规范,描述了产品的共同主要特性和功能
角色4:具体产品(Concrete Product)。它是实现了抽象产品角色所定义的接口的具体对象,由专门的具体工厂来创建。

工厂方法模式优点包括:
用户需要知道具体工厂的名称,就可以得到想要的产品无需知道产品的具体创建过程
系统的灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
高层模块只需知道产品抽象类,关心其他实现类,这满足了迪米特法则、依赖倒置原则和里里氏替换原则
工厂方法模式的缺点包括:
类的个数可能过多增加了系统的复杂度理解难度
如果抽象产品只能生产一种产品,这可能成为一个限制。
工厂方法模式适用于以下场景
客户不关心创建产品的细节只关心创建产品的工厂名
一个类通过其子类指定创建哪个产品对象
这种模式是在简单工厂模式上改进,核心工厂类不再负责所有产品的构建,而是将具体的工作交给子类进行实现,不再接触业务相关具体细节
示例:
定义了一个Shape接口和实现了Shape接口的具体类Circle。然后定义一个工厂类ShapeFactory,它可以根据参数创建不同类型的Shape对象

java">//定义形状接口
public interface Shape {void draw();
}//圆形类(具体产品实现)
public class Circle implements Shape{@Overridepublic void draw() {System.out.println("Circle::draw()");}
}
//工厂方法类--根据产品给对象实例化
public class ShapeFactory {public static Shape getShape(String shapeType){if (shapeType==null){return null;}if (shapeType.equalsIgnoreCase("CIRCLE")){return new Circle();}//这里可以添加更多的形状和对应的条件判断return null;}
}
//测试类
public class FactoryPatternDemo {public static void main(String[] args) {Shape circle =ShapeFactory.getShape("CIRCLE");if (circle!=null){circle.draw();}//这里可以添加更多的形状测试}
}

http://www.ppmy.cn/server/16244.html

相关文章

tcp通信协议

#include <myhead.h> #define IP "192.168.124.73" #define PORT 8888 int main(int argc, const char *argv[]) { //创建流式套接字 int sfd socket(AF_INET,SOCK_STREAM,0); if(sfd < 0){ fprintf(stderr,"line%d",__LI…

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…

PVE虚拟机隐藏状态栏虚拟设备

虚拟机启动后&#xff0c;状态栏会出现一些虚拟设备&#xff0c;点击弹出会导致虚拟机无法使用。 解决方案&#xff1a; 1、在桌面新建disable_virtio_removale.bat文件&#xff0c;内容如下&#xff1a; ECHO OFF FOR /f %%A IN (reg query "HKLM\SYSTEM\CurrentContro…

【MySQL篇】mysqlpump和mysqldump参数区别总汇(第三篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

用html写一个窗口风景动画

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>窗边风景动画</title><link rel"stylesheet" href"./style.css"> </head> <body><!-- 窗户 -->&l…

ABAP 遗传算法求解

本文无文本解析&#xff0c;结尾处有简单装箱问题的示例&#xff0c;该算法收敛结果较慢&#xff0c;仅供ABAP爱好者参考&#xff0c;实践&#xff0c;实际应用建议使用线性规划。可直接复制后在系统中使用。 对象自定义逻辑版本-截图 对象自定义逻辑版本-对象描述 INIT I…

MySQL|数据库|MySQL数据库的Sleep进程过多的处理方式

前言&#xff1a; MySQL数据库是和其它的关系型数据库基本一样&#xff0c;开箱了就能用&#xff0c;但性能方面还需要仔细的配置&#xff0c;最后才能完全的发挥它的性能&#xff0c;也需要相关服务的开发遵循数据库的开发规范&#xff0c;例如&#xff0c;减少大事务&#x…

web案例

一、结合抽奖案例完成随机点名程序&#xff0c;要求如下: 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 3.样式请参考css及html自由发挥完成。 二…