【设计模式】Factory
前言
这篇博客将包括两种设计模式,一种是工厂模式,一种是抽象工厂模式。不管是哪一种设计模式,本质上在解决的问题是对象创建的问题。工厂,可以是简简单单的一个函数,也可以是一个有具体实现的类,也可以是一个抽象的类。它们共同的特点都是在创建对象。工厂,根据函数输入,或者自身的类型,决定创建抽象类的一个/一族子类对象。
变的是什么呢?对象的创建
不变的是什么呢?总有一个对象要被创建出来:工厂方法的调用
简单工厂
简单工厂往往就是一个函数,当然这个函数需要一个类承载它。简单工厂的这个函数,输入是创建类需要的信息,输出是一个抽象类。函数内部是根据信息去决定创建哪一个抽象类的子类。
工厂模式
在工厂模式中,有一个抽象的工厂类,这个类定义了创建对象的抽象方法,由具体的工厂去实现如何创建对象。有一个抽象的Product类,这个Product类提供了一些抽象方法,提供给Product的使用者调用,具体实现由子类来完成。
下图只是工厂方法的一种诠释,核心在于工厂方法。当然工厂类不一定需要productDoSomething()方法,在要使用这个Product的地方的时候,调用工厂类的createProduct()返回一个对象也是可以的。
分析
当一个类A依赖另一个抽象类B的时候,需要根据一些信息去创建B的子类对象,每次增加了新的B的子类,都要去"修改"A中创建子类的代码。于是,为了将变的部分分离,将创建子类对象这一变的部分抽取出来,形成一个抽象的createXXX方法。这样,当增加B的子类的时候,如果需要使用,就去"扩展"A,实现createXXX,不需要改动A和B。
这个模式符合开闭原则,并且将A不再需要了解B的具体子类。
代码分析
这里分析[4]中提到的,iterator()是一个工厂方法,它的UML图如下,以下列出来的仅仅是冰山一角。容器的种类那么多,对应的容器的迭代器也很多。那么这么多的容器和迭代器该如何正确管理呢?答案还是:对扩展开放,对修改封闭。
所有的可迭代的容器去实现Iterable中iterator()方法,这个方法让每个容器具体的去创建一个迭代器类。在ArrayList实现了一个内部类Itr,这个Itr就是ArrayList的实现了Iterator接口的迭代器。其他的可迭代的类,实现iterator()的接口类似如此。
抽象工厂
抽象工厂模式和工厂模式的区别在于抽象Product类的规模。工厂模式,解决的是一个Product类。抽象工厂模式,解决的是一族Product类。这一族类是有关联的,它们之间的合作需要来自同一个类。
抽象工厂的一个应用场景是GUI组件。GUI的按钮,文本,布局,容器等,在各个平台上的实现是不一样的,那么可以对每个平台创建一个具体的工厂,来解决GUI组件的创建。一旦工厂被创建出来,工厂的使用者不需要关心创建出来的组件之间是否兼容,因为只要它们来自同一个工厂,都默认是兼容的。
参考
1,https://refactoring.guru/design-patterns
2,https://www.runoob.com/design-pattern/design-pattern-intro.html
3,Head First设计模式
4,Android源代码设计模式解析与实战
5,https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
【设计模式】Factory的更多相关文章
- C++设计模式-Factory工厂模式
Factory1.定义创建对象的接口,封装对象的创建2.将实际创建工作延迟到子类中,例如,类A中药使用类B,B是抽象父类,但是在类A中不知道具体要实例化哪一个B的子类,但是在类A的子类D中是可以知道的 ...
- 工厂设计模式 Factory
Factory 主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 例如:汽车销售商场 该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创建对象,该模 ...
- 使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)
本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...
- 三种常见设计模式 - Factory
创建型模型 一.简单工厂模式 靠 if else 或者 select case 等分支去控制不同对象的创建,难以维护 二.工厂方法模式 Factory 实现方式:将创建对象的方法定义成一个接口,通过 ...
- Java 设计模式实现 不错的引用
这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...
- Template Method 模板设计模式
什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...
- [php]php设计模式 (总结)
转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925 ...
- Java设计模式从精通到入门五 抽象工厂方法模式
定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...
- 《PHP设计模式大全》系列分享专栏
<PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第 ...
- 设计模式学习笔记(详细) - 七大原则、UML类图、23种设计模式
目录 设计模式七大原则 UML类图 设计模式分类 单例模式 工厂设计模式 简单工厂模式 工厂方法模式(使用抽象类,多个is-a) 抽象工厂模式(使用接口,多个like-a) 原型模式 建造者模式 适配 ...
随机推荐
- CodeForces - 1245D(思维+最小生成树)
题意 https://vjudge.net/problem/CodeForces-1245D 已知一个平面上有 n 个城市,需要个 n 个城市均通上电 一个城市有电,必须在这个城市有发电站或者和一个有 ...
- Java学习笔记(2)--- 对象和类入门,java包,this 和 super区别
1.对象和类(Object and class): 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 面对对象编程是java非常重要的一部分,作者本身之前学过c ...
- fetchone函数和fetchall函数返回值的区别
fetchone函数和fetchall函数返回值的区别 1.fetchone() 返回单个的元组,也就是一条记录(row),如果没有结果,则python返回 None 有结果时,如图: 没结果时,如 ...
- 手动O3
#pragma GCC optimize(3,"Ofast","inline") 貌似这玩意并不能在noip考场上用
- 树莓派包含python2.7系统路径
- Vue indent eslint缩进webstorm冲突解决
参考教程 官方回复 ESlint设置 rules: { 'no-multiple-empty-lines': [1, {max: 3}], // 控制允许的最多的空行数量 'vue/script-in ...
- Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树
D. Shichikuji and Power Grid</centerD.> Shichikuji is the new resident deity of the South Blac ...
- [探究] dsu on tree,一类树上离线问题的做法
dsu on tree. \(\rm 0x01\) 前言\(\&\)技术分析 \(\bold{dsu~on~tree}\),中文别称"树上启发式合并"(虽然我并不承认这种称 ...
- Paper | BLIND QUALITY ASSESSMENT OF COMPRESSED IMAGES VIA PSEUDO STRUCTURAL SIMILARITY
目录 1. 技术细节 1.1 得到MDI 1.2 判别伪结构,计算伪结构相似性 2. 实验 动机:作者认为,基于块的压缩会产生一种伪结构(pseudo structures),并且不同程度压缩产生的伪 ...
- github上计算String相似度好的项目
项目中包含了杰卡德NGram.cosin夹角.最长公共子序列.边际距离等常用的相似度算法. https://github.com/tdebatty/java-string-similarity