设计模式(3):工厂模式

一.工厂模式

  • 实现了创建者和调用者的分离。

二.分类

  • 简单工厂模式

    • 用来生产同一等级结构中的任意产品。(对于新增产品,需要修改已有代码。用的最多)
    • 要点: 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
  • 工厂方法模式

  • 抽象工厂模式

    • 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

三.要点:

  • 理论上工厂方法模式更优,但实际上,我们一般都使用简单工厂模式。 \color{red}{理论上工厂方法模式更优,但实际上,我们一般都使用简单工厂模式。} 理论上工厂方法模式更优,但实际上,我们一般都使用简单工厂模式。

四.核心本质

  • 实例化对象,用工厂方法代替new操作;
  • 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

五.具体实现

  • 1.简单工厂模式

    • 代码实现

      • 类和接口

/*** 车运行的接口*/
public interface Car {void run();
}
/*** 奥迪车运行实现类 */
public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪在跑。。。");}
}
/*** 比亚迪车运行实现类 */
public class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪在跑。。。");}
}
      • 简单工厂类1(也称静态工厂)

/*** 简单工厂类1(也称静态工厂)* @author Administrator**/
public class CarFactory {public static Car createCar(String type){if("奥迪".equals(type)){return new Audi();}else if("比亚迪".equals(type)){return new Byd();}else{return null;}}
}
/***  简单工厂类调用* @author admin*/
public static void main(String[] args) {Car c1= CarFactory.createCar("奥迪");Car c2= CarFactory.createCar("比亚迪");c1.run();c2.run();
}
      • 简单工厂类2(也称静态工厂)

/*** 简单工厂类2(也称静态工厂)* @author Administrator**/
public class CarFactory {public static Car createAudi(){return new Audi();	}public static Car createByd(){return new Byd();	}
}
/***  简单工厂类实现* @author admin*/
public static void main(String[] args) {Car c1= CarFactory.createAudi();Car c2= CarFactory.createByd();c1.run();c2.run();
}






  • 2.工厂方法模式

    • 代码实现

      • 类和接口

/*** 车运行的接口*/
public interface Car {void run();
}
/*** 奥迪车运行实现类 */
public class Audi implements Car {@Overridepublic void run() {System.out.println("奥迪在跑。。。");}
}
/*** 比亚迪车运行实现类 */
public class Byd implements Car {@Overridepublic void run() {System.out.println("比亚迪在跑。。。");}
}
      • 工厂方法模式接口

/*** 工厂方法模式接口*/
public interface CarFactory {Car CreateCar();
}
/*** 工厂方法模式接口实现类*/
public class BydFactory implements CarFactory {@Overridepublic Car CreateCar() {return new Byd();}
}
/*** 工厂方法模式接口方法的重写*/
public class AudiFactory implements CarFactory {@Overridepublic Car CreateCar() {return new Audi();}
}
      • 工厂方法模式调用

/*** 方法工厂模式实现类*/
public static void main(String[] args) {//new AudiFactory().CreateCar().run();Car c=new AudiFactory().CreateCar();c.run();		
}






  • 3.抽象工厂模式

    • 代码实现

      • 类和接口

/*** 座椅接口*/
public interface Seat {void massage();
}
/*** 高端座椅*/
class LuxurySeat implements Seat{@Overridepublic void massage() {System.out.println("高端座椅可以按摩。。。。。");}
}
/*** 低端座椅*/
class LowySeat implements Seat{@Overridepublic void massage() {System.out.println("低端座椅不能按摩。。。。。");}
}
/*** 轮胎接口*/
public interface Tyre {void revolve();
}
/*** 高端轮胎*/
class LuxuryTyre implements Tyre{@Overridepublic void revolve() {System.out.println("不会磨损。。。。");}
}
/*** 低端轮胎*/
class LowTyre implements Tyre{@Overridepublic void revolve() {System.out.println("磨损快。。。。。");}
}
/*** 引擎接口*/
public interface Engine {void run();void start();
}
/*** 高端引擎*/
class LuxuryEngine implements Engine{@Overridepublic void run() {System.out.println("速度快。。。。。。");}@Overridepublic void start() {System.out.println("启动快,。。。。。。");}
}
/*** 低端引擎*/
class LowyEngine implements Engine{@Overridepublic void run() {System.out.println("速度慢。。。。。。");}@Overridepublic void start() {System.out.println("启动慢,。。。。。。");}
}
      • 抽象工厂接口和实现类

/*** 汽车工厂*/
public interface CarFactory {Engine createEngine();  //创建引擎Seat createSeat();		//座椅Tyre createTyre();		//轮胎
}
/*** 低端汽车*/
public class LowCarFactory implements CarFactory {@Overridepublic Engine createEngine() {return new LowyEngine();}@Overridepublic Seat createSeat() {return new LowySeat();}@Overridepublic Tyre createTyre() {return new LowTyre();}
}
/*** 高端汽车*/
public class LuxuryCarFactory implements CarFactory{@Overridepublic Engine createEngine() {return new LuxuryEngine();}@Overridepublic Seat createSeat() {return new  LuxurySeat();}@Overridepublic Tyre createTyre() {return new LuxuryTyre() ;}
}
      • 抽象工厂调用

/*** 抽象工厂模式测试类*/
public static void main(String[] args) {CarFactory c =new LowCarFactory();		Engine e=c.createEngine();e.run();e.start();CarFactory c1 =new LuxuryCarFactory();Engine e1=c.createEngine();e1.run();e1.start();
}

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

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

相关文章

Git相关命令(二)

三、Team协作 分支概念:由于多人贡献于同一个仓库,但是又不能同时直接再仓库上修改,所以就需要从主仓库分支,每个人在自己对应的分支上操作,最后在合并到主仓库即可 1、fork 仓库。这是 github 的操作,而…

【Java面试题】操作系统

文章目录 1.进程/线程/协程1.1辨别进程和线程的异同1.2优缺点1.2.1进程1.2.2线程 1.3进程/线程之间通信的方法1.3.1进程之间通信的方法1.3.2线程之间通信的方法 1.4什么是线程上下文切换1.5协程1.5.1协程的定义?1.5.2使用协程的原因?1.5.3协程的优缺点&a…

Android-AR眼镜屏幕显示

Android-AR眼镜 前提:Android手持设备 需要具备DP高清口 1、创建Presentation(双屏异显) public class MyPresentation extends Presentation {private PreviewSingleBinding binding;private ScanActivity activity;public MyPresentatio…

后缀名是safetensors和pt、h5有什么区别

后缀名为.safetensors、.pt(PyTorch tensor)和.h5(HDF5)的文件都是用于存储深度学习模型的文件格式,但它们在设计目的、压缩效率、安全性和兼容性方面有所不同。 .safetensors 设计目的:.safetensors格式专…

大模型如何通过token进行推理?

大型模型通过token进行推理的过程通常涉及以下步骤: 1、Tokenization(分词):首先,输入文本或序列被分割成tokens,这些tokens通常是单词、子词或字符的序列。这一步通常由预训练模型的tokenizers完成。 2、…

计算机网络:物理层 - 编码与调制

计算机网络:物理层 - 编码与调制 基本概念编码不归零制编码归零制编码曼彻斯特编码差分曼彻斯特编码 调制调幅调频调相混合调制 基本概念 在计算机网络中,计算机需要处理和传输用户的文字、图片、音频和视频,他们可以统称为消息数据&#xf…

[GXYCTF2019]StrongestMind

web请求类题目,要求1000次 import requests from bs4 import BeautifulSoup import time urlhttp://ad7bc925-bc7a-4881-8a75-9045b60d4ab2.node5.buuoj.cn:81/index.php srequests.session() #维持会话 datas.get(url) for i in range(1001):soupBeautifulSoup(d…

探究 HTTPS 的工作过程

目录 1. HTTPS 协议原理 1.1. 为什么要有HTTPS协议 1.2. 如何理解安全 1.3. HTTPS 协议是什么 2. HTTPS 的前置概念 2.1. 什么是加密 && 解密 2.2. 为什么要加密 2.3. 常见的加密方式 2.3.1. 对称加密 2.3.2. 非对称加密 2.4. 数据摘要 && 数据指纹…

MyBatis3源码深度解析(二十四)级联映射与关联查询(一)级联映射的使用

文章目录 前言第十章 MyBatis级联映射与懒加载10.1 MyBatis级联映射的使用10.1.1 简单查询10.1.1.1 数据准备10.1.1.2 编写实体类10.1.1.3 编写Mapper接口及XML配置文件10.1.1.4 编写MyBatis主配置文件10.1.1.5 编写单元测试 10.1.2 一对多级联映射10.1.2.1 外部Mapper方式10.1…

怎麼實現Nginx反向代理?

Nginx是一款開源軟體,可以作為Web伺服器、負載均衡器和反向代理使用,是高性能的HTTP和反向代理伺服器。其中反向代理是Nginx的一項重要特性。接下來,我們詳細講一下Nginx反向代理的實現和應用。 反向代理是什麼? 代理一詞通常指的…

使用第三方远程连接工具ssh连接vagrant创建的虚拟机

vagrant默认密码都是vagrant 密码认证默认是关闭的,进入虚拟机,打开密码认证 1、使用命令vi /etc/ssh/sshd_config进入配置,注意要切换到root用户,这个配置root有权限 2、找到PasswordAuthentication默认为no,改为yes 3、重启虚…

Redis如何应对缓存穿透问题——Java全栈知识(9)

我们在正常使用缓存的时候的流程大概就是这样的: 请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。 1、缓存穿透问题 但是如果由恶意请求,短时间内大量的访问不存在的数据,这时每个请求…

暴力破解笔记

1 暴力破解简介 暴力破解: 蛮力攻击,又称为穷举攻击,或暴力破解,将密码进行逐个尝试验证,直到尝试出真正的密码为止。 暴力破解是指采用反复试错的方法并希望最终猜对,以尝试破解密码或用户名或找到隐藏的…

33岁TVB「御用少妻」近况曝光,中戏毕业后跑龙套8年终于上位。

日前,33岁无线小花刘温馨应邀出席了「香港首个女性健康运动与艺术文化慈善嘉年华」,并开心写道:「好开心参与到~香港首个女性健康运动与艺术文化慈善嘉年华 H.E.R Festival。片一:请找亮点。」片中刘温馨暂时其柔软的身…

3.26学习总结

java 实例变量和局部变量 实例变量是记录这个类中对象的特点的每一个对象的实例变量都可以不同(例如名字,性别等),其中一个对象的实例变量改变不会影响其他的变量. 类变量是一种特殊的实例变量,他的特殊在于所有的对象的类变量都是相同的,当一个对象改变了类变量那么所有对象…

雷卯推荐多种系列汽车级TVS供您选择

1. 车规级TVS的应用 2.车规级TVS系列表格如下 3.方案推荐 12V汽车电源浪涌保护方案 方案优点:用于满足前装汽车的ISO7637-2 5A5BA测试,可采用单独大功率的TVS或PTCTVS的组合方案,满足ISO10605-2, 等级4,接触放电15K…

初识云原生、虚拟化、DevOps

文章目录 K8S虚拟化DevOpsdevops平台搭建工具大数据架构 K8S master 主节点,控制平台,Master节点负责核心的调度、管理和运维,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节点来提高集群可用度…

uniapp 使用命令行创建vue3 ts 项目

命令行创建 uni-app 项目: vue3 ts 版 npx degit dcloudio/uni-preset-vue#vite-ts 项目名称注意 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 如果下载失败,请去gitee下载 https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite-ts…

2024 解决 Failed to launch process [ElasticSearch]

操作系统:centos 7 (x86) sonarQube不能使⽤root账号进⾏启动,所以需要创建普通⽤户及其⽤户组 一、问题描述:使用root启动时,一直反馈 SonarQube is not running 问题原因:不能够使用root用户进行启动 解决方案…

【Effective Web】html/css优化和技巧

html/css优化和技巧 html/css可以做到一些js的功能&#xff0c;减少js操作dom的高昂成本。 巧用伪类 显示勾选时文案 checkbo勾选时触发&#xff0c;实现checkbox的简单选中事件处理 <template><input type"checkbox" /><span class"checkb…