05设计模式——抽象工厂模式

前言:以下总结来自龙哥---左潇龙博客。

总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html

 

  抽象工厂模式算是工厂相关模式的终极形态,它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。这其实是工厂方法模式的一种扩展

  通常意义来我们谈到扩展,通常有两种方式可以扩展一个接口或者类,就是继承和组合。

  通常情况下,我们推荐使用组合扩展一个现有的类或接口,但这并非绝对,如果你扩展的子类或子接口与现有的类或接口明显是“是一个(is a)”的关系,也就是继承的关系,那么使用继承可以获得更多的好处。

  定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

  定义中说了,我们是要创建一个接口,是为了创建一组相关或者相互依赖的对象,而且还有一点就是,我们创建的对象不是具体的类,也就是说我们创建的是一个接口或者一个抽象类。

 1 interface ProductA {
 2 
 3     void methodA();
 4 }
 5 
 6 interface ProductB {
 7     
 8     void methodB();
 9 }
10 
11 class ProductA1 implements ProductA{
12 
13     public void methodA() {
14         System.out.println("产品A系列中1型号产品的方法");
15     }
16     
17 }
18 
19 class ProductA2 implements ProductA{
20 
21     public void methodA() {
22         System.out.println("产品A系列中2型号产品的方法");
23     }
24     
25 }
26 
27 class ProductB1 implements ProductB{
28 
29     public void methodB() {
30         System.out.println("产品B系列中1型号产品的方法");
31     }
32     
33 }
34 
35 class ProductB2 implements ProductB{
36 
37     public void methodB() {
38         System.out.println("产品B系列中2型号产品的方法");
39     }
40     
41 }
42 
43 public interface Creator {
44 
45     ProductA createProductA();
46     
47     ProductB createProductB();
48     
49 }
50 
51 public class ConcreteCreator1 implements Creator{
52 
53     public ProductA createProductA() {
54         return new ProductA1();
55     }
56 
57     public ProductB createProductB() {
58         return new ProductB1();
59     }
60 
61 }
62 
63 public class ConcreteCreator2 implements Creator{
64 
65     public ProductA createProductA() {
66         return new ProductA2();
67     }
68 
69     public ProductB createProductB() {
70         return new ProductB2();
71     }
72 
73 }
74 
75 public class Client {
76 
77     public static void main(String[] args) throws Exception {
78         Creator creator = new ConcreteCreator1();
79         ProductA productA = creator.createProductA();
80         ProductB productB = creator.createProductB();
81         productA.methodA();
82         productB.methodB();
83         
84         creator = new ConcreteCreator2();
85         productA = creator.createProductA();
86         productB = creator.createProductB();
87         productA.methodA();
88         productB.methodB();
89     }
90 }

  抽象工厂模式一般是为了处理抽象产品多于一个的问题,而且这些产品多数情况下是有关系的。

  基于抽象工厂一旦定义,抽象产品的个数就已经固定,所以最好在抽象产品的个数不太会变化的情况下使用抽象工厂模式,当然,我们可以使用继承去弥补抽象工厂模式的这一不足,创造另外一个继承体系去扩展现有的框架。

三种设计模式依次进化的原因

  1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

       2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

  我们在处理很多问题的时候其实是有很多种方式的,而且每一种方式可能都有各自的好处和坏处,很难去判断说那一种方式是最好的,而且也根本就没有这个说法,所以我们能做的,就是根据实际的情况去掂量各个方式的利弊,从而选择出一种更适合当前情况的处理方式。

 

转载于:https://www.cnblogs.com/hilter/p/8821306.html

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

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

相关文章

卫星发现,这里用十年逆转了千年!

以下内容影像、地形以及气象数据都来自卫星观测记录我们与这个星球如何共处并解决自身的发展问题这是我们的星球这也是我们的星球地球表面的气体流动被卫星和超级计算机所感知它们带来降雨或干旱富饶或贫瘠改变着一块又一块土地一群又一群人一个又一个时代亚洲大陆西南从印度洋…

张亚勤:新范式、新架构和新模态突破传统算力,推动物理世界走向数字化

本文转自联想创投近日,在联想创投2020 CEO年会上,清华大学讲席教授、智能产业研究院院长、美国艺术与科学院院士、百度前总裁张亚勤先生带来了《未来科技趋势展望》。张亚勤表示,数字化的3.0时期已经到来,数字化的范围已从内容、社…

【华为出品】智能体白皮书2020(附全文下载)

来源 | 华为、IDC、中国信通院等微信编辑 | 邱峰、罗兵微信审核 | 张祥、吴斌、数字理政究院、中通协大数据分会IDC、中国信息化百人会、中国信息通信研究院、中国人工智能产业发展联盟与华为联合编撰的《智能体白皮书》指出,在第四次工业革命爆发前的历史拐点&…

吴恩达【深度学习工程师】 04.卷积神经网络 第四周特殊应用(2)神经风格转换...

该笔记介绍的是《卷积神经网络》系列第四周:特殊应用(2)神经风格转换 主要内容有: 1.神经风格转换 2.卷积网络隐藏单元可视化显示 3.神经风格转换代价函数 4.内容代价函数 5.风格代价函数 *6.数据从一维到三维的推广 神经风格转换 把C(conten…

php grepmatch,linux最快的文本搜索神器ripgrep(grep的最好代替者)

前言说到文本搜索工具,大家一定会知道 grep, 它是 linux 最有用并最常用的工具之一。但如果要再一个大的工程项目中搜索某个关键词,大家也一定知道它比较耗时。所以就有了很多替代工具,之前最出名的是 Ack,Ag而最近又有了新的替代…

蒲慕明:《大脑之美》序言,脑探索的起点

来源:神经现实本文经授权摘自《大脑之美》序言作者:蒲慕明现代神经科学起源于十九世纪末期;圣地亚哥拉蒙-卡哈尔(Santiago Ramn y)的神经解剖学研究和他提出的神经元理论是主要的起点。一百多年来,神经科学…

slow log php,善用php-fpm的慢执行日志slow log,分析php性能问题

众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题。作为mysql的好搭档,php也有这样的功能。如果你使用php-fpm来管理php的话,你可以通过如下选项开启。PHP 5.3.3 之前设置如下&#…

量子信息技术研究现状与未来——郭光灿

来源: 中国科学杂志社量子信息技术是量子力学与信息科学融合的新兴交叉学科, 它的诞生标志着人类社会将从经典技术迈进到量子技术的新时代, 本文将阐述量子信息技术的研究现状与未来. 文中描绘了量子技术发展远景, 即筑建各种类型的量子网络, 包括量子云计算网络、分…

springboot需要tomcat服务器吗_嵌入式 Tomcat AJP 协议对 SpringBoot 应用的影响

前言2020 年 1 月 6 日,国家信息安全漏洞共享平台(CNVD)收录了由北京长亭科技有限公司发现并报送的 Apache Tomcat 文件包含漏洞。Tomcat AJP 协议由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器 webapp 下…

php session 前缀,PHP文件包含--session

利用条件:session文件路径已知,且其中内容部分可控。php的session文件的保存路径可以在phpinfo的session.save_path看到。session 的文件名格式为 sess_[phpsessid],而 sessionid 在发送的请求的 cookie 字段中也可以看到。实例:“…

大脑与数学——利用代数拓扑研究模拟大脑 第一部分

来源:遇见数学蓝脑计划(Blue Brain Project)是尝试利用分子层级的哺乳类脑部逆向工程建立一个电脑模拟脑。这里模拟并不仅是包括人工神经网络模型,也包括生物过程的真实神经元模型,和一个经验重建模型连接组。该计划希…

spring cloud每次修改必须重新打包_Java面试系列spring相关

Spring中的Bean是线程安全的吗?Spring 中的 bean 默认都是单例的,所有线程都共享一个单例实例Bean,因此是存在资源的竞争,是线程不安全的。但是spring中大部分bean都是在方法内部操作,例如:Controller、Ser…

谈谈实现小样本学习的两条路径

来源:混沌巡洋舰小样本学习是当下机器学习界的一个核心课题。大数据是当下深度学习的咽喉,面临收集成本昂贵,甚至根本无法采集的弊端, 小样本学习的实践价值不言而喻。对于众多产业来说, 真正能够收集到大量样本的是极…

什么是物联网?常见IoT协议最全讲解

作者:付强来源:IoT物联网技术(ID:IoT-Tech-Expo)01 什么是物联网?物联网(Internet of Things)这个概念读者应该不会陌生。物联网的概念最早于1999年被提出来,曾被称为继计算机、互联…

java下发命令nbiot,NB物联网之天翼物联(3)——编解码插件上传规则细解(java开发物联网)...

前言电信的编解码插件本意上是可以让我们的开发更加灵活,但是你好歹把文档写明白啊。。。同时在正常的生产中我们的产品不可能只使用电信的模块,有时甚至是客户要求使用移动还是电信的模块,所以兼容性给我们的体验非常直观!我们先…

netcat使用

前言 最近在做渗透测试的时候遇到了端口监听和shell的反弹问题,在这个过程中自己对Netcat这一款神器有了新的认识,现将一些Netcat的用法做一个小总结,希望对各位有帮助! Netcat简介 Netcat是一款非常出名的网络工具,简…

重磅:国家正式出台学术不端行为界定

来源:科研大匠大家都在反对学术不端,何为学术不端?如何界定学术不端行为?其实,此前并没有一个明确的标准。2019年5月29日,国家新闻出版署才正式发布我国首个针对学术不端行为的行业标准——《学术出版规范—…

Gartner:解开关于人工智能的六个迷思

来源:Gartner“人工智能将自动执行所有工作并让人类失业。”“人工智能只是一种虚构的技术。”“机器人将占领整个世界。”围绕人工智能的炒作给主流媒体、董事会议和各企业机构留下了许多迷思。有人担心“万能”的人工智能将占领全世界,有人则认为人工智…

java搭建线程池框架,JAVA线程池管理及分布式HADOOP调度框架搭建

大家看到了线程的好处了吧!单线程需要10S,10个线程只需要1S。充分利用了系统资源实现并行计算。也许这里会产生一个误解,是不是增加的线程个数越多效率越高。线程越多处理性能越高这个是错误的,范式都要合适,过了就不好…

IBM将收购Instana公司,持续推进其混合云和人工智能战略

来源:IBM中国收购 Instana 后,IBM 将帮助企业在多团队和多云(平均 2到 15个)环境下更好地管理他们的应用性能。[1]这也是 IBM 持续完善其由人工智能所驱动的自动化能力的又一例证,IBM 的其他相关举措还包括&#xff1a…