工厂模式的目的就是将对象的创建过程隐藏起来,从而达到很高的灵活性,工厂模式分为三类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

在没有工厂模式的时候就是,客户需要一辆马车,需要客户亲自去创建一辆马车,然后拿来用。

  • 在简单工厂模式下,客户可以通过工厂获得一辆马车,需要下单后,告诉马车的型号,然后工厂可以根据型号创建马车。
  • 在工厂方法模式下:客户想要一辆马车,需要指明型号创建。比如325i的bmw,和530li,根据各自325i的工厂和530li的工厂创建,每个工厂创建一个系列。即具体的工厂只能创建出一个具体的产品。
  • 在抽象工厂模式下:客户想要一辆带空调的宝马车,于是开始创建带空调的宝马车,不需要自己创建安装。

不适用工厂模式

如果不使用工厂,用户将自己创建宝马车,具体UML图和代码如下:

public class BMW320 {public BMW320(){System.out.println("制造-->BMW320");}
}public class BMW523 {public BMW523(){System.out.println("制造-->BMW523");}
}public class Customer {public static void main(String[] args) {BMW320 bmw320 = new BMW320();BMW523 bmw523 = new BMW523();}
}

用户需要知道怎么创建一款车,这样子客户和车就紧密耦合在一起了,为了降低耦合,就出现了简单工厂模式,把创建宝马的操作细节都放到了工厂里,而客户直接使用工厂的创建方法,传入想要的宝马车型号就行了,而不必去知道创建的细节。

简单工厂模式:

核心是:创建一个对象的接口,然后根据接口创建具体的实现,将创建与本身的业务逻辑分开,降低耦合度。

1.UML图:

  • 工厂类角色: 该模式的核心,用来创建产品,含有一定的商业逻辑和判断逻辑

  • 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

  • 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

2.代码实现:

产品类

abstract class BMW {public BMW(){}
}public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}

工厂类

public class Factory {public BMW createBMW(int type) {switch (type) {case 320:return new BMW320();case 523:return new BMW523();default:break;}return null;}
}

用户类

public class Customer {public static void main(String[] args) {Factory factory = new Factory();BMW bmw320 = factory.createBMW(320);BMW bmw523 = factory.createBMW(523);}
}
3.优点

         简单工厂模式提供了专门的工厂类用于创建对象,实现类对象的创建和使用的职责分离,客户端不需要知道所创建的具体产品类的类名以及创建过程,只需要具体产品所对应的参数即可。通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

4.缺点

        在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

为了解决简单工厂模式的问题,出现了工厂方法模式。

工厂模式

        工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。在使用时,用于只需知道产品对应的具体工厂,不需要关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了。

        但缺点在于,每增加一个产品都需要增加一个具体产品类和实现工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

1.UML图

抽象工厂 AbstractFactory: 工厂方法模式的核心,是具体工厂角色必须实现的接口或者必须继承的父类,在 Java 中它由抽象类或者接口来实现。具体工厂 Factory:被应用程序调用以创建具体产品的对象,含有和具体业务逻辑有关的代码抽象产品 AbstractProduct:是具体产品继承的父类或实现的接口,在 Java 中一般有抽象类或者接口来实现。 具体产品 Product:具体工厂角色所创建的对象就是此角色的实例。
代码实现

产品类

abstract class BMW {public BMW(){}
}
public class BMW320 extends BMW {public BMW320() {System.out.println("制造-->BMW320");}
}
public class BMW523 extends BMW{public BMW523(){System.out.println("制造-->BMW523");}
}

工厂类;

interface FactoryBMW {BMW createBMW();
}public class FactoryBMW320 implements FactoryBMW{@Overridepublic BMW320 createBMW() {return new BMW320();}}
public class FactoryBMW523 implements FactoryBMW {@Overridepublic BMW523 createBMW() {return new BMW523();}
}

用户类

public class Customer {public static void main(String[] args) {FactoryBMW320 factoryBMW320 = new FactoryBMW320();BMW320 bmw320 = factoryBMW320.createBMW();FactoryBMW523 factoryBMW523 = new FactoryBMW523();BMW523 bmw523 = factoryBMW523.createBMW();}
}

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

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

相关文章

PDF之Blend Mode(混合模式)BM(对应OFD的BlendMode)

Blend Mode(混合模式)用于定义对象与背景或其他对象之间的颜色混合方式。PDF支持多种混合模式,常见的混合模式包括: Normal:正常混合模式,将对象颜色直接叠加在背景上。 Multiply:乘法混合模式…

经验分享:C++ error:‘syscall’ was not declared in this scope

明明已经加了头文件 #include <sys/syscall.h>#define gettid() syscall(__NR_gettid)但是依旧不能使用 syscall() 函数&#xff0c; 检查源码后&#xff1a; sys/syscall.h 内部表示&#xff0c;他封装了 打开对应的 syscall.h 文件内部依旧没有 syscall()函数的声明…

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…

全栈实现发送验证码注册账号 全栈开发之路——全栈篇(3)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

基于JAVA的Dubbo 实现的各种限流算法

在基于 Java 的 Dubbo 实现中&#xff0c;限流&#xff08;Rate Limiting&#xff09;同样是一个关键的需求。Dubbo 是阿里巴巴开源的一款高性能 Java RPC 框架&#xff0c;广泛应用于分布式服务架构中。实现限流可以帮助服务在高并发场景下保持稳定性和可靠性。以下是几种常见…

Linux进程调度与切换、环境变量

文章目录 Linux优先级Linux的调度与切换**进程切换**&#xff1a;**进程调度**&#xff1a;优先级活动队列过期队列active指针和expired指针 环境变量main函数参数 int main(int argc, char *argv[], char *envp[]) 环境变量环境变量和本地变量echo查看单个环境变量的方法expor…

蓝牙模块在无人机 ID识别、标准制定发挥的作用及其应用优势和面临的挑战

随着科技的飞速发展&#xff0c;无人机已经广泛应用于航拍、农业、救援、物流等多个领域。而在无人机的通信与控制系统中&#xff0c;蓝牙模块扮演着重要的角色。本文将探讨蓝牙模块在无人机Remote ID识别和标准制定执行中发挥的作用&#xff0c;并分析其应用优势和面临的挑战。…

装饰器模式在JS中的应用

装饰器模式在JavaScript中的应用主要是通过修饰函数或类来添加额外的功能或行为。 在ES6中&#xff0c;装饰器模式可以通过使用语法糖来实现。我们可以将装饰器应用于函数、类、方法或属性等。下面是一些在JavaScript中使用装饰器模式的示例&#xff1a; 修饰函数&#xff1a…

2.Spring中用到的设计模式

Spring框架中使用了多种设计模式来构建其强大且灵活的功能&#xff0c;这里举例说明Spring中的一些功能使用到的设计模式。 工厂模式&#xff1a;Spring容器本质是一个大工厂&#xff0c;使用工厂模式通过BeanFactory和ApplicationContext这两个核心接口来创建和管理bean对象。…

Java读取串口及端口调试

本篇主要讲述使用Java对串口进行读取和发送操作 准备 在项目中导入第三方Jar包 Jar包已经在资源中绑定&#xff0c;或者去官网上自行下载jSerialComm 注意当前jar包是配合JDK1.8环境使用&#xff0c;如果是1.8以下程序将直接中断 安装虚拟串口的软件 Configure Virtual Seri…

一款功能强大的安卓虚拟机应用——VMOS Pro使用分享

前段时间我刚刚分享一个WeChat平板模块能够允许用户自由修改系统设置&#xff0c;让你的Android备用手机焕发新生&#xff0c;实现手机PAD化&#xff0c;实现两台设备同时登录微信号。今天我分享的这个相比WeChat更为简单&#xff0c;因为它可以通过虚拟机的方式进行多种androi…

分类和品牌关联

文章目录 1.数据库表设计1.多表关联设计2.创建表 2.使用renren-generator生成CRUD1.基本配置检查1.generator.properties2.application.yml 2.生成代码1.进入localhost:81生成代码2.将main目录覆盖sunliving-commodity模块的main目录 3.代码检查1.注释掉CategoryBrandRelationC…

Tencent : TBDS简介

Tencent TBDS&#xff08;Tencent Big Data Suite&#xff09;是腾讯公司推出的大数据处理套件&#xff0c;它基于腾讯多年海量数据处理经验&#xff0c;依托云原生技术和泛Hadoop生态开源技术&#xff0c;为用户提供可靠、安全、易用的大数据处理平台。 TBDS可以在公有云、私…

JavaWeb基础(HTML,CSS,JS)

这些知识用了三四天左右学完&#xff0c;因为是JavaWeb&#xff0c;并不是前端&#xff0c;所以只是够用&#xff0c;不是深入&#xff0c;但是这确实是学校一个学期交的东西&#xff08;JavaWeb课程&#xff09;。 总结一下网页分为三部分&#xff1a;HTML(内容结构),CSS&…

MySql--SQL语言

目录 SQl---DDL 结构定义 创建、删除 数据库 代码 运行 设计表 数据类型 整数 浮点数 主键 约束 主键自增长 默认值 字段注释 创建、删除 表 代码 运行 代码 代码 运行 SQL---DML 数据操纵 插入数据 代码 运行 代码 运行 代码 运行 代码 …

【实战教程】使用Spring AOP和自定义注解监控接口调用

一、背景 随着项目的长期运行和迭代&#xff0c;积累的功能日益繁多&#xff0c;但并非所有功能都能得到用户的频繁使用或实际上根本无人问津。 为了提高系统性能和代码质量&#xff0c;我们往往需要对那些不常用的功能进行下线处理。 那么&#xff0c;该下线哪些功能呢&…

贪心算法: 单调递增的数字

参考资料&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 倒序遍历每个数字&#xff0c;遇到前一个比后一个大的就减一&#xff0c;最后统一把后面几位置为9 String str n"";char[] chars str.toCharArray();int flag c…

docker部署kafka实战

目录 一、部署kafaka、zookeeper 二、测试信息发送与接收 三、kafka进阶 一、部署kafaka、zookeeper 请提前安装docker、docker-compose 安装docker&#xff1a;docker--安装docker-ce-CSDN博客 安装docker-compose&#xff1a; 安装docker-compose_安装 docker-compose-CSD…

云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例

在2024年3月20日的首场OceanBase数据库城市行活动中&#xff0c;专注于物流及供应链解决方案的丽迅物流的架构师阳磊&#xff0c;围绕“OB Cloud在丽迅物流的实践”这一主题&#xff0c;进行了精彩的演讲。本文为此次演讲的内容回顾。 在丽迅物流&#xff08;Lesoon Logistics…

小demo - 列表hide or not (含代码)

直接上代码 <!DOCTYPE html> <html><head><style>.menu {width: 220px;height: 800px;border: 1px solid #dddddd;}.item {cursor: pointer;}.menu .header {padding: 10px 5px;background-color: goldenrod;}.menu .content a {display: block;paddi…