`
eriol
  • 浏览: 409129 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Head First 设计模式--Factory

阅读更多

chapter 4 --工厂模式

                                  烘烤OO的精华

 

1. 当使用new时,是在实例化一个具体类,所以是对实现而不是接口进行编程。

 

2. 如果代码是针对接口而写,那么可以通过多态,它可以与任何新类实现该接口。

 

3. 在设计模式中,所谓的“实现一个接口”并不一定表示“写一个类,并利用implement关键词来实现某个Java接口”。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。

 

4. 工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码和子类对象创建代码解耦了。

abstract Product factoryMethod(String type)

- 工厂方法是抽象的,所以依赖子类来处理对象的创建

 

- 工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。

- 工厂方法将客户(也就是超类中的代码)和实际创建具体产品的代码分隔开来。

- 工厂方法可能需要参数(也可能不需要)来指定所要的产品。

 

5. 所有工厂模式都用来封装对象的创建。工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象的过程封装的目的。

 

 

工厂方法模式:

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

 

Factory method

Structure

  • Product: 所有的产品必须实现这个共同的接口,这样,使用这些产品的类就可以引用这个接口,而不是具体类。
  • Creator: 是一个类,它实现了所有操纵产品的方法,但不实现工厂方法。Creator所有的子类都必须实现这个抽象的factoryMethod()方法。
  • ConcreteCreator: 实现了factoryMethod(),以实际制造出产品。
  • ConcreteProduct: 只有ConcreteCreator类知道如何创建这些产品。

设计原则:

 

(1)  要依赖抽象,不要依赖具体类。(依赖倒置原则)

说明了不能让高层组件依赖低层组件,而且,不管高层或低层组件,两者都应该依赖于抽象。所谓高层组件,是由其他低层组件定义其行为的类。倒置是指和一般OO设计的思考方式完全相反。低层组件现在依赖高层的抽象了。

 

 

以下指导方针,可以帮助你避免在OO设计中违反依赖倒置原则:

 

  • 变量不可以持有具体类的引用。如果使用new,就会持有具体类的引用。你可以改用工厂来避开这种做法。
  • 不要让类派生自具体类。如果派生自具体类,你就会依赖具体类。请派生自一个抽象(接口或抽象类)
  • 不要覆盖基类中已实现的方法。如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享

 

6. 通过抽象工厂所提供的接口,可以创建产品的家族,利用这个接口书写代码,我们的代码将从实际工厂解耦,以便在不同的上下文中实现各式各样的工厂,制造出各种不同的产品。

 

7. 从抽象工厂中派生出一些具体工厂,这些工厂产生相同的产品,但产品的实现不同。

 

 

抽象工厂模式:

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

- 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么样子。

 

Abstract Factory

Structure

  • AbstractFactory: 抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
  • ConcreteFactory: 具体工厂实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而完全不需实例化任何产品对象。
  • Client: 客户的代码只需涉及抽象工厂,运行时将自动使用实际的工厂。
  • AbstractProduct: 这就是产品家族,每个具体工厂都能够生产一整组的产品。
  • Product

 

8. 抽象工厂的任务是定义一个负责创建一组产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。所以,在抽象工厂中常利用工厂方法来实现生产方法。

 

9. 比较

工厂方法使用继承来负责创建对象,利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。其实整个工厂方法模式,只不过就是通过子类来创建对象。所以工厂方法只负责将客户从具体类型中解耦;而抽象工厂使用组合来负责创建对象。抽象工厂提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对对象类型所写的代码中。(组合)

 

 

本章小结:

  • 所有的工厂都是用来封装对象的创建。
  • 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
  • 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
  • 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
  • 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
  • 工厂方法允许类将实例化延迟到子类进行。
  • 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
  • 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
分享到:
评论

相关推荐

    新建文本文档 (2).txt

    新建文本文档 (2).txt

    Another-Redis-Desktop-Manager.1.5.2.exe

    Another-Redis-Desktop-Manager.1.5.2.exe

    (23149420)STM32F407驱动LCD12864代码 LCD12864带中文字库

    这个程序是用于stm32F407 驱动 12864 LCD使用的,lcd是带有中文字库版本的lcd。 关于这份代码 请参考我的csdn博客 https://jeason.blog.csdn.net/article/details/99691445 有问题您可以在博客下留言,我会尽快回复您的。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    白色大气风格的电影下载网站模板下载.zip

    白色大气风格的电影下载网站模板下载.zip

    VB+ACCESS超市管理系统设计(源代码+系统)(20245h).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    VB+ACCESS学生公寓管理系统(源代码+系统)(2024vq).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    AI8051U第五节 - GPIO中断源代码

    AI8051U第五节 - GPIO中断源代码

    码上抓小说:Python爬虫搞定顶点小说全攻略

    内容概要: 想要轻松获取顶点小说网站上的最新章节吗?本资源将手把手教你如何用Python编写爬虫,从顶点小说网站抓取你喜爱的小说数据。我们将一起学习如何搭建爬虫环境、发送网络请求、解析网页内容、提取有用信息,并将这些数据保存下来。无论是为了个人娱乐还是数据分析,这个教程都能帮到你。 适用人群: 编程新手:想要通过动手实践来学习Python的小伙伴们。 技术爱好者:对网络爬虫和数据抓取感兴趣的技术发烧友。 书迷朋友们:想要一键获取小说最新章节的阅读爱好者。 学习者和研究者:需要大量文本数据进行分析或学术研究的朋友们。 使用场景及目标: 个人娱乐:在休闲时间,通过编写爬虫来获取自己喜欢的小说,享受编程带来的乐趣。 数据收集:为数据分析、内容创作或学术研究自动收集顶点小说网站上的文本数据。 技术提升:通过实际项目提升自己的Python编程技能,特别是在网络爬虫领域。 教育学习:作为教学材料,帮助学生理解网络爬虫的工作原理和应用场景。 其他说明: 本教程适合所有对Python爬虫感兴趣的朋友,即使你是编程小白也不用担心,我们会从零开始,一步步带你入门。

    白色扁平风格的原创素材类企业网站源码下载.zip

    白色扁平风格的原创素材类企业网站源码下载.zip

    白色扁平化风格的滑雪运动体育项目模板.zip

    白色扁平化风格的滑雪运动体育项目模板.zip

    白色创意风格的房地产建筑整站网站源码下载.zip

    白色创意风格的房地产建筑整站网站源码下载.zip

    白色大气风格响应式个人主页博客网站模板.zip

    白色大气风格响应式个人主页博客网站模板.zip

    多元统计分析重点.docx

    多元统计分析重点.docx

    白色大气风格的汽车4s店模板下载.zip

    白色大气风格的汽车4s店模板下载.zip

    白色扁平化的牛排汉堡西餐厅企业网站模板.zip

    白色扁平化的牛排汉堡西餐厅企业网站模板.zip

    圣诞树html展示代码资料.zip

    圣诞树html圣诞树html展示代码资料.zip

    sealos离线安装k8s集群镜像-part1

    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

    (33587448)Java版 愤怒的小鸟开源游戏

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    白色简洁风格的博客论坛后台系统源码下载.zip

    白色简洁风格的博客论坛后台系统源码下载.zip

    HTML与CSS实现简单圣诞树网页

    内容概要:本文介绍了使用 HTML 和 CSS 创建一个简单的圣诞树网页的方法。文章提供了一段示例代码,利用定位、边框技巧构建了树的基本结构,并通过背景色、边框色等设置了节日气氛。通过嵌套元素和定位来布置装饰物,如星星和红色小球。 适用人群:适用于对 HTML 与 CSS 基础有所了解的初学者。 使用场景及目标:旨在为网站设计师或前端开发人员提供节日氛围的设计灵感,帮助其学会使用 HTML 和 CSS 进行基础图形和布局设计。 其他说明:示例代码可以作为起点,在实际应用中可以通过增加 CSS 动画、交互功能等方式来丰富和完善设计。此外,也鼓励开发者尝试不同的样式和技术,比如 Flexbox 或 Grid 布局,提高页面的适应性和美观度。

Global site tag (gtag.js) - Google Analytics