chapter 4 --工厂模式
烘烤OO的精华
1. 当使用new时,是在实例化一个具体类,所以是对实现而不是接口进行编程。
2. 如果代码是针对接口而写,那么可以通过多态,它可以与任何新类实现该接口。
3. 在设计模式中,所谓的“实现一个接口”并不一定表示“写一个类,并利用implement关键词来实现某个Java接口”。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。
4. 工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码和子类对象创建代码解耦了。
abstract Product factoryMethod(String type)
- 工厂方法是抽象的,所以依赖子类来处理对象的创建
- 工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。
- 工厂方法将客户(也就是超类中的代码)和实际创建具体产品的代码分隔开来。
- 工厂方法可能需要参数(也可能不需要)来指定所要的产品。
5. 所有工厂模式都用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象的过程封装的目的。
工厂方法模式:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
Structure
- Product: 所有的产品必须实现这个共同的接口,这样,使用这些产品的类就可以引用这个接口,而不是具体类。
- Creator: 是一个类,它实现了所有操纵产品的方法,但不实现工厂方法。Creator所有的子类都必须实现这个抽象的factoryMethod()方法。
- ConcreteCreator: 实现了factoryMethod(),以实际制造出产品。
- ConcreteProduct: 只有ConcreteCreator类知道如何创建这些产品。
设计原则:
(1) 要依赖抽象,不要依赖具体类。(依赖倒置原则)
说明了不能让高层组件依赖低层组件,而且,不管高层或低层组件,两者都应该依赖于抽象。所谓高层组件,是由其他低层组件定义其行为的类。倒置是指和一般OO设计的思考方式完全相反。低层组件现在依赖高层的抽象了。
以下指导方针,可以帮助你避免在OO设计中违反依赖倒置原则:
- 变量不可以持有具体类的引用。如果使用new,就会持有具体类的引用。你可以改用工厂来避开这种做法。
- 不要让类派生自具体类。如果派生自具体类,你就会依赖具体类。请派生自一个抽象(接口或抽象类)
- 不要覆盖基类中已实现的方法。如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享
6. 通过抽象工厂所提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同的上下文中实现各式各样的工厂,制造出各种不同的产品。
7. 从抽象工厂中派生出一些具体工厂,这些工厂产生相同的产品,但产品的实现不同。
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么样子。
Structure
- AbstractFactory: 抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
- ConcreteFactory: 具体工厂实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而完全不需实例化任何产品对象。
- Client: 客户的代码只需涉及抽象工厂,运行时将自动使用实际的工厂。
- AbstractProduct: 这就是产品家族,每个具体工厂都能够生产一整组的产品。
- Product
8. 抽象工厂的任务是定义一个负责创建一组产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以,在抽象工厂中常利用工厂方法来实现生产方法。
9. 比较
工厂方法使用继承来负责创建对象,利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。其实整个工厂方法模式,只不过就是通过子类来创建对象。所以工厂方法只负责将客户从具体类型中解耦;而抽象工厂使用组合来负责创建对象。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对对象类型所写的代码中。(组合)
本章小结:
- 所有的工厂都是用来封装对象的创建。
- 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
- 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
- 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
- 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
- 工厂方法允许类将实例化延迟到子类进行。
- 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
- 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
分享到:
相关推荐
新建文本文档 (2).txt
Another-Redis-Desktop-Manager.1.5.2.exe
这个程序是用于stm32F407 驱动 12864 LCD使用的,lcd是带有中文字库版本的lcd。 关于这份代码 请参考我的csdn博客 https://jeason.blog.csdn.net/article/details/99691445 有问题您可以在博客下留言,我会尽快回复您的。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
白色大气风格的电影下载网站模板下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
AI8051U第五节 - GPIO中断源代码
内容概要: 想要轻松获取顶点小说网站上的最新章节吗?本资源将手把手教你如何用Python编写爬虫,从顶点小说网站抓取你喜爱的小说数据。我们将一起学习如何搭建爬虫环境、发送网络请求、解析网页内容、提取有用信息,并将这些数据保存下来。无论是为了个人娱乐还是数据分析,这个教程都能帮到你。 适用人群: 编程新手:想要通过动手实践来学习Python的小伙伴们。 技术爱好者:对网络爬虫和数据抓取感兴趣的技术发烧友。 书迷朋友们:想要一键获取小说最新章节的阅读爱好者。 学习者和研究者:需要大量文本数据进行分析或学术研究的朋友们。 使用场景及目标: 个人娱乐:在休闲时间,通过编写爬虫来获取自己喜欢的小说,享受编程带来的乐趣。 数据收集:为数据分析、内容创作或学术研究自动收集顶点小说网站上的文本数据。 技术提升:通过实际项目提升自己的Python编程技能,特别是在网络爬虫领域。 教育学习:作为教学材料,帮助学生理解网络爬虫的工作原理和应用场景。 其他说明: 本教程适合所有对Python爬虫感兴趣的朋友,即使你是编程小白也不用担心,我们会从零开始,一步步带你入门。
白色扁平风格的原创素材类企业网站源码下载.zip
白色扁平化风格的滑雪运动体育项目模板.zip
白色创意风格的房地产建筑整站网站源码下载.zip
白色大气风格响应式个人主页博客网站模板.zip
多元统计分析重点.docx
白色大气风格的汽车4s店模板下载.zip
白色扁平化的牛排汉堡西餐厅企业网站模板.zip
圣诞树html圣诞树html展示代码资料.zip
sealos离线安装k8s集群镜像-part1 包含镜像列表如下: sealos离线安装包:sealos_5.0.0_linux_arm64.tar.gz 网络通信组建件cni: cni-plugins-linux-arm64-v0.8.7.tgz 监控数据的聚合器组件: metrics-server.tar IP地址管理和网络隔离组件: flannel.tar CNI 通信组件:cilium.tar k8s打包部署组件:helm.tar
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
白色简洁风格的博客论坛后台系统源码下载.zip
内容概要:本文介绍了使用 HTML 和 CSS 创建一个简单的圣诞树网页的方法。文章提供了一段示例代码,利用定位、边框技巧构建了树的基本结构,并通过背景色、边框色等设置了节日气氛。通过嵌套元素和定位来布置装饰物,如星星和红色小球。 适用人群:适用于对 HTML 与 CSS 基础有所了解的初学者。 使用场景及目标:旨在为网站设计师或前端开发人员提供节日氛围的设计灵感,帮助其学会使用 HTML 和 CSS 进行基础图形和布局设计。 其他说明:示例代码可以作为起点,在实际应用中可以通过增加 CSS 动画、交互功能等方式来丰富和完善设计。此外,也鼓励开发者尝试不同的样式和技术,比如 Flexbox 或 Grid 布局,提高页面的适应性和美观度。