设计模式 简单工厂 工厂方法模式 抽象工厂模式

工厂模式介绍

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。

简单工厂

简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式

简单工厂适用于工厂类负责创建的对象较少的场景, 且客户端只需要传入工厂类的参数, 对于如何创建对象的逻辑不需要关心

适用场景: 工厂类负责创建的对象较少 对于如何创建对象的逻辑不需要关心

优点: 只需要传入一个正确的参数 就可以获取所需要的对象 无需知道创建细节

缺点: 违背开闭原则 不易于扩展过于复杂的产品结构 新增产品需要修改工厂类的代码

以下我们用支付场景演示简单工厂用法

1.定义支付接口

/*** 支付接口** @author Lion Li*/
public interface IPay {void payment();
}

2.编写工厂实例

/*** 付款方式工厂** @author Lion Li*/
public class PayFactory {/*** 创建付款实例* Class<? extends IPay> 单一原则 限制必须是 IPay 的子类*/public IPay create(Class<? extends IPay> clazz) {if (null != clazz) {try {return clazz.newInstance();} catch (Exception e) {throw new RuntimeException(e);}}return null;}}

3.编写具体的支付类 例如: 微信 支付宝

/*** 微信支付** @author Lion Li*/
public class WxPay implements IPay {public void payment() {System.out.println("微信支付");}
}
/*** 支付宝支付** @author Lion Li*/
public class ZfbPay implements IPay {public void payment() {System.out.println("支付宝支付");}
}

4.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args) {IPay wx = new PayFactory().create(WxPay.class);IPay zfb = new PayFactory().create(ZfbPay.class);wx.payment();zfb.payment();}
}

工厂方法模式

工厂方法模式是指定义一个创建对象的接口, 但让实现这个接口的类来觉得实例化哪个类, 工厂方法让类的实例化推迟到子类中进行

适用场景: 创建对象需要大量重复的代码 不依赖于产品类实例如何被创建 实现等细节

优点: 用户只需要关心所需要产品对应的工厂 无需关心创建细节 加入新产品符合开闭原则 提供了系统的可扩展性

缺点: 类的个数容易过多 增加的代码的结构负责都 增加了系统的抽象性和理解难度

以下我们用汽车场景工厂方法模式用法

1.定义汽车接口规范

/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}

2.编写汽车工厂接口规范

/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}

3.编写具体的汽车种类 例如: 宝马 大众

/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}

4.编写具体的汽车工厂 例如: 宝马工厂 大众工厂

/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}

5.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args){ICarFactory baomaFactory = new BaoMaCarFactory();ICar baoma = baomaFactory.create();baoma.name();ICarFactory dazhongFactory = new DaZhongCarFactory();ICar dazhong = dazhongFactory.create();dazhong.name();}}

抽象工厂

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口 无需指定他们具体的类

适用场景:

  1. 不依赖于产品类实例如何被创建等细节 强调一系列相关产品对象一起使用创建对象需要大量重复的代码
  2. 提供一个产品类的库 所有产品以同样的接口出现 从而不依赖于具体的实现

优点: 具体产品在应用层代码隔离 无需关心创建细节 将一个系列的产品统一到一起创建

缺点: 规定了所有可能被创建的产品集合 产品中扩展新产品困难 需要修改抽象工厂的接口 增加了系统的理解难度和抽象性

以下我们用多种出行方式来演示抽象工厂用法

1.定义产品接口规范

/*** 汽车接口规范** @author Lion Li*/
public interface ICar {void name();
}
/*** 飞机接口规范** @author Lion Li*/
public interface IAircraft {void name();
}

2.定义产品工厂接口规范

/*** 汽车工厂接口规范** @author Lion Li*/
public interface ICarFactory {ICar create();
}
/*** 飞机工厂接口规范** @author Lion Li*/
public interface IAircraftFactory {IAircraft create();
}

3.定义所有产品实现

/*** 宝马汽车** @author Lion Li*/
public class BaoMaCar implements ICar {public void name() {System.out.println("我是宝马");}
}
/*** 大众汽车** @author Lion Li*/
public class DaZhongCar implements ICar {public void name() {System.out.println("我是大众");}
}
/*** 波音飞机** @author Lion Li*/
public class BoYinAircraft implements IAircraft {public void name() {System.out.println("我是波音");}
}
/*** 空客飞机** @author Lion Li*/
public class KongKeAircraft implements IAircraft {public void name() {System.out.println("我是空客");}
}

4.定义所有产品工厂实现

/*** 宝马汽车工厂** @author Lion Li*/
public class BaoMaCarFactory implements ICarFactory {public ICar create() {return new BaoMaCar();}
}
/*** 大众汽车工厂** @author Lion Li*/
public class DaZhongCarFactory implements ICarFactory {public ICar create() {return new DaZhongCar();}
}
/*** 波音飞机工厂** @author Lion Li*/
public class BoYinAircraftFactory implements IAircraftFactory {public IAircraft create() {return new BoYinAircraft();}
}
/*** 空客飞机工厂** @author Lion Li*/
public class KongKeAircraftFactory implements IAircraftFactory {public IAircraft create() {return new KongKeAircraft();}
}

5.定义交通工具抽象工厂

/*** 交通工具抽象工厂** @author Lion Li*/
public abstract class TransportationFactory {public void init() {System.out.println("初始化数据");}protected abstract ICar createCar(Class<? extends ICarFactory> clazz);protected abstract IAircraft createAircraft(Class<? extends IAircraftFactory> clazz);
}

6.定义出行方式工厂

/*** 出行方式工厂** @author Lion Li*/
public class TravelFactory extends TransportationFactory {@Overrideprotected ICar createCar(Class<? extends ICarFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}@Overrideprotected IAircraft createAircraft(Class<? extends IAircraftFactory> clazz) {super.init();if (null != clazz) {try {return clazz.newInstance().create();} catch (Exception e) {throw new RuntimeException(e);}}return null;}
}

7.编写测试类并运行测试

/*** @author Lion Li*/
public class Test {public static void main(String[] args){TransportationFactory factory = new TravelFactory();ICar baoma = factory.createCar(BaoMaCarFactory.class);baoma.name();ICar dazhong = factory.createCar(DaZhongCarFactory.class);dazhong.name();IAircraft boyin = factory.createAircraft(BoYinAircraftFactory.class);boyin.name();IAircraft kongke = factory.createAircraft(KongKeAircraftFactory.class);kongke.name();}}

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

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

相关文章

如何在Go中并发运行多个函数

引言 Go语言的一个流行特性是它对并发的一流支持,即一个程序可以同时做多件事。随着计算机从更快地运行单个代码流转向同时运行更多代码流,能够并发地运行代码正在成为编程的重要组成部分。为了让程序运行得更快,程序员需要把程序设计成并发运行,这样程序中并发的每一部分…

mmpose 使用笔记

目录 自己整理的可以跑通的代码&#xff1a; 图片demo&#xff1a; 检测加关键点 自己整理的可以跑通的代码&#xff1a; 最强姿态模型 mmpose 使用实例-CSDN博客 图片demo&#xff1a; python demo/image_demo.py \tests/data/coco/000000000785.jpg \configs/body_2d_k…

AE-制作绚丽的图形通道

目录 1.新建合成命名为四边形 2.在合成中新建纯色层命名为tao 3.在纯色层上添加RG Trapcode –>Tao 效果&#xff0c;设置Segment参数 4. 在合成中添加摄像机 5.设置Tao Repeat Paths 相关参数&#xff0c;并调整摄像机的位置 6.设置Tao的 Material & Lighting 等…

基于Springboot的高校教学评价系统的设计与实现(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Springboot的高校教…

如何通过TortoiseGit可视化工具查看Git管理的版本树和信息(工作树变更)内容

一、版本树 黑色直线&#xff1a;master分支和基于master分支拉取基础分支都在这条线上&#xff0c;是一条直线。 其他线条&#xff1a;新开分支一定会增加一条线&#xff0c;但不一定每一条线分别代表一个分支。 注&#xff1a;如果一直是一个人&#xff0c;在同一个本地分支…

(三)Java 基本数据类型

目录 一. 前言 二. 基本数据类型 2.1. char&#xff08;字符型&#xff09; 2.2. byte&#xff08;字节型&#xff09; 2.3. short&#xff08;短整型&#xff09; 2.4. int&#xff08;整型&#xff09; 2.5. long&#xff08;长整型&#xff09; 2.6. float&#xff…

前端如何设置模板参数

1.背景&#xff1a; 最近接到一个需求&#xff0c;在一个类似chatGpt的聊天工具中&#xff0c;要在对话框中设置模板&#xff0c;后端提供了很多模板参数&#xff0c;然后要求将后端返回的特殊字符转成按钮&#xff0c;编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…

C++ 类模板

目录 前言 类模板语法 类模板和函数模板的区别 类模板没有自动类型推导的使用方式 类模板在模板参数列表中可以有默认参数 类模板中成员函数创建时机 类模板对象做函数参数 指定传入的类型 参数模板化 整个类模板化 类模板与继承 类模板成员函数类外实现 类模板分…

在Spring Cloud中使用OpenFeign完成从一个微服务上传到另一个微服务中

跨服务上传文件&#xff0c;嘿嘿&#xff0c;来一篇实用性高的&#xff0c;本篇将主要完成在Feign中上传文件到另一个微服务中。步骤如下&#xff1a; 我们需要在服务提供者和服务消费者的项目中添加相应的依赖&#xff1a; 对于服务提供者的项目&#xff0c;你需要添加Sprin…

Redis设计与实现之集合及有序集

目录 一、集合 1、编码的选择 2、编码的切换 3、 字典编码的集合 4、集合命令的实现 5、 求交集算法 6、求并集算法 7、 求差集算法 二、有序集 1、编码的选择 2、编码的转换 3、ZIPLIST 编码的有序集 4、SKIPLIST 编码的有序集 三、如何添加元素到集合或有序集中…

万兆网络之屏蔽线序接法(中)

在介绍优质网线选购之前&#xff0c;先简单介绍一下水晶头 1毛钱一颗跟1元一颗的水晶头&#xff0c;往往是金手指厚度差别&#xff0c;你可以想象压制的时候可能会有什么情况 另外&#xff0c;一些3元一颗的镀金水晶头会有15U、30U之类的是电镀厚度单位&#xff0c;数值越大镀…

文档安全加固:零容忍盗窃,如何有效预防重要信息外泄

文档安全保护不仅需要从源头着手&#xff0c;杜绝文档在使用和传播过程中产生的泄密风险&#xff0c;同时还需要对文档内容本身进行有效的保护。为了防范通过拷贝、截屏、拍照等手段盗窃重要文档内容信息的风险&#xff0c;迅软DSE加密软件提供了文档加密保护功能&#xff0c;能…

10 新字符设备驱动文件

一、新字符设备驱动原理 因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件&#xff0c;现在可以用新字符设备驱动 API 函数。 1. 分配和和释放设备号 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可&#xff0c;但是这样会带来两…

信息安全和网络安全的区别

信息安全与网络安全都属于安全领域&#xff0c;但它们的范围和重点不同。 信息安全主要关注数据的保护&#xff0c;包括对敏感数据进行加密、防止数据丢失或泄露等措施。信息安全通常与数据存储、传输和处理相关。 而网络安全更侧重于保护计算机系统和网络免受攻击、病毒、蠕…

Mac安装软件显示文件已损坏处理方法

今天安装软件&#xff0c;突然遇到了文件已损坏&#xff0c;扔到废纸篓的情况&#xff0c;于是搜索了下解决办法&#xff0c;跟大家分享下&#xff0c;希望对你有所帮助 一、检查安全性设置 打开【设置】-【隐私与安全】&#xff0c;下拉找到安全性&#xff0c;将安全性更改为…

System作为系统进程陔如何关闭?

一、简介 system进程是不可以关闭的&#xff0c;它是用来运行一些系统命令的&#xff0c;比如reboot、shutdown等&#xff0c;以及用来运行一些后台程序&#xff0c;比如ntfs-3g、v4l2loopback等。system进程也被用于运行一些内核模块&#xff0c;比如nvidia、atd等。system进程…

mars3d加载arcgis发布的服务,⽀持4523坐标

问题 1.从这个服务地址加载&#xff0c;具体在哪⾥去转坐标呢&#xff1f; 加个 usePreCachedTilesIfAvailable&#xff1a;false 参数即可 坐标系为4490的arcgis影像服务图层&#xff0c;配置后瓦片加载不出来&#xff0c;没报错 甚至可以跳转 没有看出问题&#xff0c;或者测…

linux系统启动时运行web程序

1.修改rc.local文件 执行命令如果找不到会报错command not found &#xff0c;使用全路径即可 找不到的话 可以使用which 命令 找到路径 后台查看执行日志 2.修改rc.local文件的权限 chmod x rc.local 然后reboot 可以查到进程和启动日志

vue3:直接修改reative的值,页面却不响应,这是什么情况?

目录 前言&#xff1a; 错误示范&#xff1a; reactive() 的局限性 解决办法&#xff1a; 1.使用ref 2.reative多套一层 3.使用Object.assign 前言&#xff1a; 今天看到有人在提问&#xff0c;问题是这样的&#xff0c;我修改了reative的值&#xff0c;数据居然失去了响…

YOLOv5改进 | 注意力篇 | DAttention (DAT)注意力机制实现极限涨点

一、本文介绍 本文给大家带来的是YOLOv5改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022年CVPR2022上同时被评选为Best Paper&#xff0c;由此可以证明其是一种十分有效的改进机制&#xff0c;其主要的核心思想是&#xff1a;引入可变形…