创建型模式之工厂模式


本质: 实例化对象不直接使用new,而是用工厂代替

工厂模式分为:

  • 简单工厂模式:用来生产同一等级结构中的任意产品(增加新产品需要修改已有代码)
  • 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
  • 抽象工厂模式:围绕一个超级工厂创建其他工厂,超级工厂可看做工厂的工厂。

简单工厂模式

为了生成所需的具体产品,工厂类提供方法,根据传入的参数决定具体实例化哪个产品类。

//产品接口:车
public interface Car {public void run();
}//具体产品1:比亚迪
public class BYD implements Car{@Overridepublic void run() {System.out.println("比亚迪");}
}
//具体产品2:特斯拉
public class TSL implements Car{@Overridepublic void run() {System.out.println("特斯拉");}
}//车工厂
public class CarFactory {public static Car getCar(String carType){Car car = null;if(carType.equals("BYD")){car = new BYD();}else if(carType.equals("TSL")){car = new TSL();}return car;}
}//测试类
public class Consumer {public static void main(String[] args) {Car byd = new CarFactory().getCar("BYD");Car tsl = new CarFactory().getCar("TSL");byd.run();tsl.run();}
}

工厂方法模式

定义一个用于创建对象的接口,让子类决定去实例化哪个类,使得类的实例化延迟到子类。
示例:

//产品:车
public interface Car {public void run();
}
//具体产品1:比亚迪
public class BYD implements Car{@Overridepublic void run() {System.out.println("比亚迪");}
}
//具体产品2:特斯拉
public class TSL implements Car {@Overridepublic void run() {System.out.println("特斯拉");}
}
//车工厂
public interface CarFactory {
public Car getCar();
}//具体产品对应的工厂1:比亚迪工厂
public class BYDFactory implements CarFactory{@Overridepublic Car getCar() {return new BYD();}
}//具体产品对应的工厂2:特斯拉工厂
public class TSLFactory implements CarFactory{@Overridepublic Car getCar() {return new TSL();}
}//测试类
public class Consumer {public static void main(String[] args) {BYDFactory bydFactory = new BYDFactory();TSLFactory tslFactory = new TSLFactory();bydFactory.getCar().run();tslFactory.getCar().run();}
}

抽象工厂模式

public interface PhoneProduct {public void call();public void sendSMS();public void takePhoto();
}public interface RouteProduct {public void start();public void shutDown();public void openWifi();public void setting();}
public class HuaweiPhone implements PhoneProduct{@Overridepublic void call() {System.out.println("华为手机打电话");}@Overridepublic void sendSMS() {System.out.println("华为手机发短信");}@Overridepublic void takePhoto() {System.out.println("华为手机拍照");}
}public class XiaomiPhone implements PhoneProduct{@Overridepublic void call() {System.out.println("小米手机打电话");}@Overridepublic void sendSMS() {System.out.println("小米手机发短信");}@Overridepublic void takePhoto() {System.out.println("小米手机拍照");}
}public class HuaweiRoute implements RouteProduct{@Overridepublic void start() {System.out.println("开启华为路由器");}@Overridepublic void shutDown() {System.out.println("关闭华为路由器");}@Overridepublic void openWifi() {System.out.println("开启华为路由器的wifi");}@Overridepublic void setting() {System.out.println("设置华为路由器");}
}public class XiaomiRoute implements RouteProduct {@Overridepublic void start() {System.out.println("开启小米路由器");}@Overridepublic void shutDown() {System.out.println("关闭小米路由器");}@Overridepublic void openWifi() {System.out.println("打开小米路由器的wifi");}@Overridepublic void setting() {System.out.println("设置小米路由器");}
}//超级工厂
public interface ProductFactory {PhoneProduct phoneProduct();RouteProduct routeProduct();
}public class HuaweiFactory implements ProductFactory{@Overridepublic PhoneProduct phoneProduct() {return new HuaweiPhone();}@Overridepublic RouteProduct routeProduct() {return new HuaweiRoute();}
}
public class XiaomiFactory implements ProductFactory{@Overridepublic PhoneProduct phoneProduct() {return new XiaomiPhone();}@Overridepublic RouteProduct routeProduct() {return new XiaomiRoute();}
}//测试类
public class Consumer {public static void main(String[] args) {System.out.println("====小米系列产品====");XiaomiFactory xiaomiFactory = new XiaomiFactory();PhoneProduct xiaomiPhone = xiaomiFactory.phoneProduct();RouteProduct xiaomiRoute = xiaomiFactory.routeProduct();xiaomiPhone.call();xiaomiRoute.setting();System.out.println("====华为系列产品====");HuaweiFactory huaweiFactory = new HuaweiFactory();PhoneProduct huaweiPhone = huaweiFactory.phoneProduct();RouteProduct huaweiRoute = huaweiFactory.routeProduct();huaweiPhone.call();huaweiRoute.setting();}
}

参考:
《实用软件设计模式教程》

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

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

相关文章

关于找不到XINPUT1_3.dll,无法继续执行代码问题的5种不同解决方法

一、xinput1_3.dll的作用 xinput1_3.dll是Windows操作系统中的一款动态链接库文件,主要用于支持游戏手柄和游戏输入设备。这款文件属于Microsoft Xbox 360兼容性库,它包含了与游戏手柄和其他输入设备相关的功能。在游戏中,xinput1_3.dll负责…

C语言——预处理详解(#define用法+注意事项)

#define 语法规定 #define定义标识符 语法: #define name stuff #define例子 #include<stdio.h> #define A 100 #define STR "abc" #define FOR for(;;)int main() {printf("%d\n", A);printf("%s\n", STR);FOR;return 0; } 运行结果…

JRT实现在线打印预览

在JRT打印元素绘制协议一篇已经介绍过打印把绘图和打印逻辑进行了分离&#xff0c;这是和老设计最大的不同。因为老的设计时候没想着做在线预览功能&#xff0c;是后面硬性扩出来的。这次从最初设计就考虑绘图逻辑各处共用&#xff0c;包括打印预览&#xff0c;在线打印预览等、…

JS代码输出题:return Promise.resolve() 情况

题目&#xff1a; Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res)})Promise.resolve().then(() > {console.log(1)}).then(() > {console.log(2)}).then(() > {console.log(3)}).then(() > {con…

MDK编译过程和文件类型

MDK是一款IDE软件&#xff0c;具有&#xff0c;编辑&#xff0c;编译&#xff0c;链接&#xff0c;下载&#xff0c;调试等等的功能。 1.编译器介绍&#xff1a; MDK可以编译C/C文件和汇编文件&#xff0c;MDK只是一款IDE软件&#xff0c;那他内部使用的是什么编译器呢&#x…

Python-折线图可视化

折线图可视化 1.JSON数据格式2.pyecharts模块介绍3.pyecharts快速入门4.创建折线图 1.JSON数据格式 1.1什么是JSON JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符串 1.2主要功能json就是一种在各个编程语言中流…

JavaSE第7篇:封装

文章目录 一、封装1、好处:2、使用 二、四种权限修饰符三、构造器1、作用2、说明3、属性赋值的过程 一、封装 封装就是将类的属性私有化,提供公有的方法访问私有属性 不对外暴露打的私有的方法 单例模式 1、好处: 1.只能通过规定的方法来访问数据 2.隐藏类的实例细节,方便…

CSS篇之圆角梯形

附上一篇文章&#xff1a;梯形tab按钮-基于clip-path path函数实现 - JSRUN.NET 他这个区别在于&#xff0c;收尾两侧都是直角的&#xff0c;如图 下面这个是圆角&#xff1a; 思路&#xff1a; 代码如下&#xff1a; <template><div class"wrap"><…

时序数据库选型TimescaleDB

最近要做一个数字车间的物联网项目&#xff0c;数据存储成了首先要解决的问题&#xff0c;整个车间一共104台数控机床&#xff0c;1s钟采集1次数据&#xff0c;360024365*1043,279,744,000 &#xff0c;一年要产生32亿条记录&#xff0c;这个数据量用常见的关系型数据库肯定是不…

【C语言加油站】qsort函数的模拟实现

qsort函数的模拟实现 导言一、回调函数二、冒泡排序2.1 冒泡排序实现升序 三、qsort函数3.1 qsort函数的使用3.2 比较函数 四、通过冒泡排序模拟实现qsort函数4.1 任务需求4.2 函数参数4.3 函数定义与声明4.4 函数实现4.4.1 函数主体4.4.2 比较函数4.4.3 元素交换 4.5 my_qsort…

Mrdoc知识文档

MrDoc知识文档平台是一款基于Python开发的在线文档系统&#xff0c;适合作为个人和中小型团队的私有云文档、云笔记和知识管理工具&#xff0c;致力于成为优秀的私有化在线文档部署方案。我现在主要把markdown笔记放在上面&#xff0c;因为平时老是需要查询一些知识点&#xff…

mysql使用st_distance_sphere函数报错Incorrect arguments to st_distance_sphere

前言 最近使用空间点位查询数据时函数报错Incorrect arguments to st_distance_sphere报错。 发现问题 因为之前是没有问题的&#xff0c;所以把问题指向了数据&#xff0c;因为是外部数据&#xff0c;不是通过系统打点获取&#xff0c;发现是因为经纬度反了&#xff0c;loc…

软件测试指南

软件测试指南 软件集成测试软件系统测试&#xff08;功能性测试&#xff0c;性能测试&#xff09;

事件监听的艺术:掌握`addEventListener`的魅力

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Vulnhub 靶场】【IA: Keyring (1.0.1)】【中等】【20210730】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/ia-keyring-101,718/ 靶场下载&#xff1a;https://download.vulnhub.com/ia/keyring-v1.01.ova 靶场难度&#xff1a;中等 发布日期&#xff1a;2021年07月30日 文件大小&#xff1a;1.1 GB 靶场作者&#xf…

基于Mamdani模糊神经网络的调速控制系统simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 模糊神经网络控制器概述 4.2 模糊神经网络控制器基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................…

UE5 项目设置

1、定义设置哪些参数 UCLASS(configEngine, globaluserconfig) class ADVMOD_API UGlobalSettings : public UObject {GENERATED_BODY()public:UGlobalSettings();const FString& GetPythonExePath() const { return PythonExePath.FilePath; }private:UPROPERTY(config, E…

【SpringBoot零基础入门到项目实战①】解锁现代Java开发之门:深度探究Spring Boot的背景、目标及选择理由

文章目录 引言Spring Boot的背景和目标背景目标 为什么选择Spring Boot1. 简化配置2. 内嵌式容器3. 生态系统支持4. 大量的Starter5. 广泛的社区支持6. 适用于微服务架构7. 丰富的扩展机制 实例演示创建一个简单的Spring Boot应用 拓展与深入学习1. Spring Boot Actuator2. Spr…

力扣刷题-二叉树-路径总和

112 路径总和 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 返回 true, 因为…

记录 | Visual Studio报错:const char*类型的值不能用于初始化char*类型

Visual Studio 报错&#xff1a; const char *”类型的值不能用于初始化“char *”类型的实体错误 解决办法&#xff1a; 1&#xff0c;强制类型转换&#xff0c;例如&#xff1a; char * Singer::pv[] {(char*)"other", (char*)"alto", (char*)"c…