设计模式之抽象工厂模式

本贴最后更新于 1995 天前,其中的信息可能已经事过景迁

示例:

	//抽象的人类,为所有的人造人提供一个相同的人造人属性
	public abstract class Man {
		public abstract void eat();
	}

	public class AsiaMan extends Man {  
		@Override
		public void eat() {
		System.out.println("亚洲人用筷子吃");
		}
	}

	public  class AmericanSuperMan extends Man  {
		@Override
		public void eat() {
		System.out.println("美国人用刀叉吃");
		}
	}
	//抽象工厂,为所有的不同的工厂提供一个制作人造人的相同方法
	public abstract class Factory {
		public abstract Man product();
	}

	public class AsiaManFactory extends Factory {
		@Override
		public Man product() {
			Man anAisaMan = new AsiaMan();
			return anAisaMan;
		}
	}

	public class AmericanFactory extends Factory {
		@Override
		public Man product() {
			AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan();
			return anAmericanSuperMan;
		}
	}   
	public static void main(String[] args) {

		AsiaManFactory asiaManFactory = new AsiaManFactory();
		AmericanFactory americanFactory = new AmericanFactory();

		Man anAmericanSuperMan = americanFactory.product();
		Man anAsia = asiaManFactory.product();

		anAsia.eat();
		anAmericanSuperMan.eat();   

	}

抽象工厂模式即将工厂抽象出来。从而极大提高开发效率。

比如自行车需要两种产品,轮胎和脚踏板。那这个时候就可以创建一个工厂生产轮胎和脚踏板。这个时候,这个就是普通工厂模式。

但是当自行车升级后,需要升级第二代轮胎和第二代脚踏板,如果还是创建一个工厂生产第二代轮胎和第二代脚踏板,那高层调用者就需要识别哪个工厂是第一代或者第二代。

这个时候抽象工厂就发挥作用了,如果将工厂抽象出来,那高层调用者就只需要知道工厂类就可以了。

抽象工厂模式的优点:

● 封装性。

每个产品的实现类不是高层模块要关心的,它要关心的是什么?
是接口,是抽象,它不关心对象是如何创建出来,这由谁负责呢?工厂类,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力,优秀设计就应该如此。

● 产品族内的约束为非公开状态。

缺点:

抽象工厂模式的最大缺点就是产品族扩展非常困难,为什么这么说呢?我们以通用代码为例,如果要增加一个产品 C,也就是说产品家族由原来的 2 个增加到 3 个,看看我们的程序有多大改动吧!
抽象类 AbstractCreator 要增加一个方法 createProductC(),然后两个实现类都要修改,想想看,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。
改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”,——只要与这段代码有关系,就可能产生侵害的危险!

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 510 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • sts
    2 引用 • 2 回帖 • 152 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 146 回帖
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    17 引用 • 6 回帖 • 28 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    534 引用 • 3528 回帖
  • 996
    13 引用 • 200 回帖 • 2 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 53 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    215 引用 • 462 回帖 • 1 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖 • 1 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    20 引用 • 74 回帖 • 2 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 497 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 8 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 161 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 安全

    安全永远都不是一个小问题。

    189 引用 • 813 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 3 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 123 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注