工厂模式

news/2024/11/16 2:17:51/文章来源:https://www.cnblogs.com/ZWJ7671277/p/18367909

工厂模式
核心本质:

实例化对象不使用new,用工厂方法创建对象
使用工厂统一管理对象的创建,将调用者跟实现类解耦
三种模式:

  1. 简单工厂模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

优点是比较好理解,简单易操作。
缺点是类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改,这违反了设计模式的开闭原则(OCP),即对扩展开放,对修改关闭。

在这里插入图片描述

手机接口类:

public interface Phone {public void call();
}

两个手机实现类:

public class IPhone implements Phone{@Overridepublic void call() {System.out.println("用苹果手机打电话!");}
}
public class MPhone implements Phone{@Overridepublic void call() {System.out.println("用小米手机打电话!");}
}

生产手机的工厂类:

public class PhoneFactory {public Phone create(String type){if (type.equals("IPhone")){return new IPhone();}else if (type.equals("MPhone")){return new MPhone();}elsereturn null;}
}

测试类:

public class Test {public static final String IPhone = "IPhone";public static final String MPhone = "MPhone";public static void main(String[] args) {// 生产小米手机PhoneFactory factory1 = new PhoneFactory();factory1.create(MPhone).call();// 生产苹果手机PhoneFactory factory2 = new PhoneFactory();factory2.create(IPhone).call();}
}

运行结果:

用小米手机打电话!
用苹果手机打电话!

2. 工厂方法模式

对简单工厂模式的改进,使用一个工厂接口,创建多个工厂类,每个工厂创建对应的对象。

在这里插入图片描述

工厂接口:

public interface PhoneFactory {public Phone create();
}

小米手机工厂:

public class MPhoneFactory implements PhoneFactory{@Overridepublic Phone create() {return new MPhone();}
}

苹果手机工厂

public class IPhoneFactory implements PhoneFactory{@Overridepublic Phone create() {return new IPhone();}
}

测试类:

public class Test {public static void main(String[] args) {// 生产小米手机PhoneFactory factory1 = new MPhoneFactory();factory1.create().call();// 生产苹果手机PhoneFactory factory2 = new IPhoneFactory();factory2.create().call();}
}
用小米手机打电话!
用苹果手机打电话!

3. 抽象工厂模式

围绕一个超级工厂创建其他工厂,每个工厂可以生产不同类型的产品

抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层,抽象工厂 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂集合, 更利于代码的维护和扩展。

在这里插入图片描述

超级工厂:

public interface Factory {public Phone createPhone();public Book createBook();
}

苹果工厂:

public class AppleFactory implements Factory{@Overridepublic Phone createPhone() {return new IPhone();}@Overridepublic Book createBook() {return new MacBook();}
}

小米工厂:

public class XiaoMiFactory implements Factory{@Overridepublic Phone createPhone() {return new MPhone();}@Overridepublic Book createBook() {return new MiBook();}
}

电脑接口类:

public interface Book {public void play();
}

电脑接口的两个实现类:

public class MacBook implements Book{@Overridepublic void play() {System.out.println("用苹果电脑打游戏!");}
}
public class MiBook implements Book{@Overridepublic void play() {System.out.println("用小米电脑打游戏!");}
}

测试类:

public class Test {public static void main(String[] args) {// 实例化苹果工厂,生产苹果手机和电脑Factory factory = new AppleFactory();factory.createBook().play();factory.createPhone().call();// 实例化小米工厂,生产小米手机和电脑Factory factory1 = new XiaoMiFactory();factory1.createBook().play();factory1.createPhone().call();}
}

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

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

相关文章

【OpenCV教程】滤波和边缘检测的过程

@目录1.均值滤波1.1 卷积核形状1.2 API1.3 效果2.高斯滤波2.1 卷积核形状2.2 API2.3 效果3.中值滤波3.1 原理3.2 API3.3 效果4.高斯双边滤波4.1 原理4.2 API4.3 效果5.获取用来形态学操作的滤波器6.腐蚀和膨胀(对二值图)6.1 原理6.2 腐蚀API6.3 效果6.4 膨胀API6.5 效果7.形态…

Excel公式和基本函数

输入完公式,点击回车,即可显示出值,<>是不等号

03-Matlab数组与矩阵

数组的建立和操作数组算术运算数组信息获取矩阵的建立矩阵的扩展矩阵的块操作矩阵中元素的删除赋值为一对方括号 矩阵的转置加点不转置为共轭复数 没点的转置为共轭复数 矩阵的旋转矩阵的翻转矩阵尺寸的改变矩阵加减法矩阵乘法矩阵除法矩阵中元素查找矩阵元素排序矩阵元素求和矩…

云音乐贵州机房迁移总体方案回顾

一、背景 2023年确定要将云音乐整体服务搬迁至贵州机房,项目需要在各种限制条件下,保障2000+应用、100w+QPS的服务稳定迁移,是云音乐历史上规模最大、人员最多、难度最高的技术项目。在此过程中,解决了大量历史技术债务,同时化解了大量新增系统性风险。以下为总体方案回顾…

湿式复合机剥离涂布机切纸机高静电横切机PLC数据采集系统车间联网方案

序号 设备名称 品牌/厂家 型号 数量 "系统类型" 品牌/厂家 "其他型号补充说明" "可用通讯接 口" 数采需求内容1 "复合机组(1#)" "松德机械股份有限公司" FTB1600 1 PLC "西门子PLC(SIEMENS)" S7-300 R…

关于SEGGER Embedded Studio的一些设置,自己摸索的

1. 删除Embedded Studio最近的项目 如下图所示,File->Recent Projects->Manage Recent Projects,就可以打开 Recent Projects 视图窗口,在此窗口中右键点击项目,进行删除,或者其他操作。2. Embedded Studio的启动文件问题 我原来的疑惑是Embedded Studio有自己的启动…

[开源分享]一个用于单片机IAP自动发送的串口助手,上位机,使用Python+tkinter制作

使用Python + tkinter制作。 这是个给单片机通过串口进行IAP的上位机,与单片机中的BOOT程序配合使用,完成对单片机APP程序的升级。可以完成bin文件的切片,CRC校验(使用Crc32Mpeg2),打包自动发送。使用Python + tkinter制作。 功能: 这是个给单片机通过串口进行IAP的上位…

go语言学习过程报错处理-哇哈哈哈

用学习来麻痹自己蠢蠢欲动的心。题记无聊学习ing,思考了下还是学下go语言写免杀木马吧,毕竟在我的学习计划里放了小半年了,上班的时候还没多少自己的时间学习。为什么无聊大家都懂吧,应该会懂的吧。主要还是需要分散下注意力,近期脑子整天都是奇奇怪怪的幻想,太影响人了。…

来了!2024 云栖大会正式启动

来了!2024 云栖大会正式启动

[开源分享]一个用于单片机IAP自动升级的串口助手,上位机,使用Python+tkinter制作

使用Python + tkinter制作。 这是个给单片机通过串口进行IAP的上位机,与单片机中的BOOT程序配合使用,完成对单片机APP程序的升级。可以完成bin文件的切片,CRC校验(使用Crc32Mpeg2),打包自动发送。使用Python + tkinter制作。 功能: 这是个给单片机通过串口进行IAP的上位…

资产负债率、净资产收益率如何解读?教你弄懂财务报表的关键

财务报表中包含大量的信息,如果我们在解读财务报表时没有思路,不分重点,就很容易被繁杂的数据弄得头晕眼花。本文就财务报表中的关键指标、资产负债率解读、净资产收益率分析、计算销售复合增长率等几个方面进行介绍,大家可以根据自己的需要进行选择性的学习。 一、这些指标…

程序运行异常: Modulo by zero

用户在使用PbootCMS系统时遇到一个问题,即在网站描述或栏目描述中添加百分号(%)会导致错误。其实, 解决并不复杂。 将模板中标题、描述、关键词用下面的标签替换就可以解决<title>{pboot:pagetitle}</title><meta name="keywords" content="…