设计模式之---工厂模式

设计模式–工厂模式

一 什么是工厂模式

使用工厂模式是为了将创建对象的具体过程屏蔽隔离起来 快速的将对象实例化 从而提高了代码的灵活性和改善了简洁性,工厂模式具体分为以下三类:

1 简单工厂模式(Simple Factory)

2 工厂方法模式(Factory Method)

3 抽象工厂模式(Abstract Factory)

三种模式从上到下逐渐变得抽象,但主要可以分为工厂方法模式和抽象工厂模式,而简单工厂模式则可以看为工厂方法模式中一个特别的案例,两者归为一类,我们先举一个例子对工厂模式做一个初步的了解

1 从前世上并没有工厂,如果客户想要一辆大众车,则需要为客户制造一辆大众车

2 简单工厂模式: 后来出现了工厂,用户不需要再去制造大众车,由工厂进行制造,想要什么车直接发给工厂制造就可以了,比如要制造帕萨特系列的车,工厂就制造这个系列的车

3 工厂方法模式:为了满足客户的需求,大众车的系列越来越多,如帕萨特,高尔夫等系列,一个工厂只能制造一个系列,所以又分为多个制造不同系列的工厂,每个具体工厂制造一个系列的车,但是大众工厂只是一个抽象的,你还需要实现具体的工厂才可以制造对应系列的车辆

4 抽象工厂模式:随着客户的要求越来越高,大众车必须配置显示屏,于是这个工厂开始生产对应系列的显示屏的车,最终客户只需要说:我想要配备小米显示屏的大众车,工厂就直接生产相应的车辆了。

下面针对几种不同的工厂模式进行详细的说明:

二 简单工厂模式

简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。

代码实现:

动物类:

public class Animal {public Animal(){}
}class Cat extends Animal{public Cat(){System.out.println("您领养了一只猫");}
}class Dog extends Animal{public Dog(){System.out.println("您领养了一只狗");}
}class Tiger extends Animal{public Tiger(){System.out.println("您领养了一只老虎");}
}一只老虎");}
}

工厂类:

public class AnimalFactory {public Animal createAnimal(String animal){switch (animal){case "dog":return new Dog();case "cat":return new Cat();case "tiger":return new Tiger();default:break;}return null;}
//用户端public static void main(String[] args) {AnimalFactory af = new AnimalFactory();Animal dog = af.createAnimal("dog");Animal cat = af.createAnimal("cat");Animal tiger = af.createAnimal("tiger");}
}

三 工厂方法模式

工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。
但缺点在于,每增加一个产品都需要增加一个具体产品类和实现工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

代码实现:

动物类:

public class Animal {public Animal(){}
}class Cat extends Animal{public Cat(){System.out.println("您领养了一只猫");}
}class Dog extends Animal{public Dog(){System.out.println("您领养了一只狗");}
}class Tiger extends Animal{public Tiger(){System.out.println("您领养了一只老虎");}
}

工厂类:

public interface AnimalFactory {Animal createAnimal();
}class CatFactory implements AnimalFactory{@Overridepublic Animal createAnimal() {return new Cat();}
}class DogFactory implements AnimalFactory{@Overridepublic Animal createAnimal() {return new Dog();}
}class TigerFactory implements AnimalFactory{@Overridepublic Animal createAnimal() {return new Tiger();}
}

客户类:

public class Customer {public static void main(String[] args) {CatFactory catFactory = new CatFactory();catFactory.createAnimal();DogFactory dogFactory = new DogFactory();dogFactory.createAnimal();}
}

四 抽象工厂模式

在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。
在介绍抽象工厂模式前,我们先厘清两个概念:

产品等级结构:产品等级结构指的是产品的继承结构,比如一个狗粮抽象类,它有A品牌狗粮、B品牌狗粮等一系列的子类,那么这个狗粮抽象类和他的子类就构成了一个产品等级结构。
产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,狗咖生产狗粮和狗绳,那么狗狗粮则位于狗粮产品族中。

什么是抽象工厂模式?

抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
但该模式的缺点在于添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

代码实现:

产品类:

public interface Food {
}class DogFood implements Food{public DogFood(){System.out.println("生产狗粮");}
}class CatFood implements Food{public CatFood(){System.out.println("生产猫粮");}
}
interface Tool{}class DogTool implements Tool{public DogTool(){System.out.println("生产养狗工具");}
}class CatTool implements Tool{public CatTool(){System.out.println("生产养猫工具");}
}

工厂类:

public interface AnimalFactory {public Food createFood();public Tool createTool();
}class CatFactory implements AnimalFactory{@Overridepublic Food createFood() {return new CatFood();}@Overridepublic Tool createTool() {return new CatTool();}
}class DogFactory implements AnimalFactory{@Overridepublic Food createFood() {return new DogFood();}@Overridepublic Tool createTool() {return new DogTool();}
}

用户类:

public class Customer {public static void main(String[] args) {CatFactory catFactory = new CatFactory();catFactory.createFood();catFactory.createTool();DogFactory dogFactory = new DogFactory();dogFactory.createFood();dogFactory.createTool();}
}

五 工厂模式小结

工厂方法模式与抽象方法模式的区别在于:

  • 工厂方法模式只有一个抽象产品类和抽象工厂类,但可以派生出许多具体的产品类和工厂类,每个具体的产品类和工厂类只能创建一个具体的实例

  • 抽象工厂模式具有多个抽象产品类和一个抽象工厂类,每个抽象产品类可以派生出来多个具体的产品类,抽象工厂类也可以派生出许多个具体的工厂类,同时每个具体的工厂类也可以创建出多个产品类的实例

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

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

相关文章

MacOS 同时配置github、gitee和gitlab密钥

MacOS 同时配置github、gitee和gitlab密钥 1 在终端中新建 ~/.ssh目录 1.1 生成GitHub、Gitee和Gitlab的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_ed25519_gitee ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_…

TikTok代理IP全面使用指南

对于那些希望通过社交媒体打造个人品牌的人来说,TikTok是现在热门的平台,他的流量与曝光不可小觑,相信很多跨境营销会选择他进行多账号营销。问题是,TikTok多账号很容易遇到封禁问题,那么如何解决? 一、什么…

无人机集群路径规划:5种优化算法(SFOA、APO、GOOSE、CO、PIO)求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化…

pytest:4种方法实现 - 重复执行用例 - 展示迭代次数

简介:在软件测试中,我们经常需要重复执行测试用例,以确保代码的稳定性和可靠性。在本文中,我们将介绍四种方法来实现重复执行测试用例,并显示当前迭代次数和剩余执行次数。这些方法将帮助你更好地追踪测试执行过程&…

Python | Leetcode Python题解之第468题验证IP地址

题目: 题解: class Solution:def validIPAddress(self, queryIP: str) -> str:if queryIP.find(".") ! -1:# IPv4last -1for i in range(4):cur (len(queryIP) if i 3 else queryIP.find(".", last 1))if cur -1:return &q…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候,发现大家对于pycharm更容易上手(可能是比较好设置中文的原因),在…

【MySQL】-- 表的操作

文章目录 1. 查看所有表1.1 语法 2. 创建表2.1 语法2.2 示例2.3 表在磁盘上对应的文件 3. 查看表结构3.1 语法3.2 示例 4. 查看创建表的语句5. 修改表5.1 语法5.2 示例5.2.1 向表中添加一列5.2.2 修改某列的长度5.2.3 重命名某列5.2.4 删除某个字段5.2.5 修改表名 6. 删除表6.1…

CANoe_调用C#控件的方法_DEMO方法演示

1、DEMO存放位置 D:\Users\Public\Documents\Vector\CANoe\Sample Configurations 11.0.96\CAN\MoreExamples\ActiveX_DotNET_Panels 每个人的电脑因为有区别存放位置不一样 2、控件制作--使用C#控件可以直接制作 3、控件代码 using System; using System.Collections; usi…

Java调用WebService接口实践案例

最终效果 在网上找了一个免费的webservice接口简单做个测试,可以正常返回结果 public static void main(String[] args) {String url = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";String xmlData = "<soapenv:Envelope xmlns:soapen…

springboot 整合spring ai实现 基于知识库的客服问答

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;常遇到的问题之一是模型可能产生幻觉&#xff0c;即生成的内容缺乏准确性。此外&#xff0c;由于大模型不直接访问企业的专有数据&#xff0c;其响应可能会显得泛泛而谈&#xff0c;不够精准或具体&#xff0c;…

onnx代码解读

一、定义 torch.jit.trace 相关代码解读onnx 内部实现 3 查看是否为aten 算子aten 算子实现torch.autograd.Functions 算子实现自定义算子实现查找未实现的节点一次性发现所有的未实现 aten 算子 二、实现 torch.jit.trace 相关代码解读 1. torch.jit.script() : 将其转换为…

CSD(computational storage devices)架构介绍

CSD&#xff08;computational storage devices&#xff09;架构介绍 前言一、CSD与传统SSD的架构对比二、为什么要采用FPGA三、FPGA缺点四、个人总结reference 前言 虽然一直有接触CSD&#xff0c;但一直对其原理和架构知之甚少&#xff0c;半知不解。今天&#xff0c;趁着我还…

CSS计数器

CSS 中的计数器类似于变量&#xff0c;可以实现简单的计数功能&#xff0c;并将结果显示在页面上&#xff0c;在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性&#xff1a; counter-reset&#xff1a;创建或者重置计数器&#xff1b;counter-increment&#xf…

机器学习框架(含实例说明)

机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施&#xff0c;帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍&#xff1a; 1. TensorFlow TensorFlow 是由Google开发的开源…

盘点2024年双十一最值得入手的好物,双十一必买清单大汇总

随着科技的飞速发展&#xff0c;数码产品已成为我们生活中不可或缺的伙伴。2024年双十一购物狂欢节即将来临&#xff0c;众多消费者早已摩拳擦掌&#xff0c;准备在这个年度盛事中淘到心仪的数码好物。在这个信息爆炸的时代&#xff0c;如何从琳琅满目的商品中挑选出性价比高、…

C# WPF 仿 Android Toast 效果

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084 主职Android, 最近需要写一些WPF的程序作为上位机&#xff0c;目前WPF的MessageBox过于臃肿&#xff0c;且想找一个内置的非阻塞的简单提示一直找不到&#xff0c;想到了Android的Toast所以写了这个扩…

如何实现C#和Python之间实时视频数据交互

我们在做RTSP|RTMP播放的时候&#xff0c;遇到好多开发者&#xff0c;他们的视觉算法大多运行在python下&#xff0c;需要高效率的实现C#和Python的视频数据交互&#xff0c;常用的方法如下&#xff1a; 方法一&#xff1a;通过HTTP请求传输视频数据 服务器端&#xff08;Pyth…

浙江省发规院产业发展研究所调研组莅临迪捷软件考察调研

2024年10月10日下午&#xff0c;浙江省发展与规划院产业发展研究所调研组一行莅临迪捷软件考察调研&#xff0c;绍兴市府办、区发改、区经信、迪荡街道等相关领导陪同。 调研组一行参观了迪捷软件的展厅与办公区&#xff0c;深入了解了迪捷软件的公司发展历程、运营状况、产品…

『网络游戏』数据库表格转储【25】

避免勿删数据库表格&#xff0c;可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本&#xff1a;NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

一文区分SSTI 和 CSTI

前言 有时&#xff0c;SSTI&#xff08;服务器端模板注入&#xff09;和 CSTI&#xff08;客户端模板注入&#xff09;可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell&#xff0c;即使payload仅限于客户端。 定义 &#x1d…