前言

这篇博客将包括两种设计模式,一种是工厂模式,一种是抽象工厂模式。不管是哪一种设计模式,本质上在解决的问题是对象创建的问题。工厂,可以是简简单单的一个函数,也可以是一个有具体实现的类,也可以是一个抽象的类。它们共同的特点都是在创建对象。工厂,根据函数输入,或者自身的类型,决定创建抽象类的一个/一族子类对象。

变的是什么呢?对象的创建
不变的是什么呢?总有一个对象要被创建出来:工厂方法的调用

简单工厂

简单工厂往往就是一个函数,当然这个函数需要一个类承载它。简单工厂的这个函数,输入是创建类需要的信息,输出是一个抽象类。函数内部是根据信息去决定创建哪一个抽象类的子类。

工厂模式

在工厂模式中,有一个抽象的工厂类,这个类定义了创建对象的抽象方法,由具体的工厂去实现如何创建对象。有一个抽象的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的更多相关文章

  1. C++设计模式-Factory工厂模式

    Factory1.定义创建对象的接口,封装对象的创建2.将实际创建工作延迟到子类中,例如,类A中药使用类B,B是抽象父类,但是在类A中不知道具体要实例化哪一个B的子类,但是在类A的子类D中是可以知道的 ...

  2. 工厂设计模式 Factory

    Factory 主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类. 例如:汽车销售商场 该模式将创建对象的过程放在了一个静态方法中来实现.在实际编程中,如果需要大量的创建对象,该模 ...

  3. 使用C# (.NET Core) 实现简单工厂(Simple Factory) 和工厂方法设计模式 (Factory Method Pattern)

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...

  4. 三种常见设计模式 - Factory

    创建型模型 一.简单工厂模式 靠 if else 或者 select case 等分支去控制不同对象的创建,难以维护 二.工厂方法模式  Factory 实现方式:将创建对象的方法定义成一个接口,通过 ...

  5. Java 设计模式实现 不错的引用

    这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...

  6. Template Method 模板设计模式

    什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...

  7. [php]php设计模式 (总结)

    转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925 ...

  8. Java设计模式从精通到入门五 抽象工厂方法模式

    定义 抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类. ​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类.工厂方法是一个 ...

  9. 《PHP设计模式大全》系列分享专栏

    <PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第 ...

  10. 设计模式学习笔记(详细) - 七大原则、UML类图、23种设计模式

    目录 设计模式七大原则 UML类图 设计模式分类 单例模式 工厂设计模式 简单工厂模式 工厂方法模式(使用抽象类,多个is-a) 抽象工厂模式(使用接口,多个like-a) 原型模式 建造者模式 适配 ...

随机推荐

  1. WebSocket实现Java后台消息推送

    1.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 2.实现原理 在实现 ...

  2. docker部署gitlab-ce

    简介 环境准备 centos7 docker 1.13.1 gitlab-ce 安装步骤 1.首先需要从docker镜像仓库当中获取gitlab-ce的最新镜像文件,由于我本机已经获取了该镜像,所以在 ...

  3. SRDC - ORA-22924 or ORA-1555 on LOB data: Checklist of Evidence to Supply (Doc ID 1682707.1)

    SRDC - ORA-22924 or ORA-1555 on LOB data: Checklist of Evidence to Supply (Doc ID 1682707.1) Action ...

  4. 网络流(3)——找到最小st-剪切

    在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网.与此同时,交战双方也想要以最小的代价切断敌军的补给,从而使敌军处于孤立无援的境地.在古今中外的各 ...

  5. CUDA -- 内存分配

    CUDA可以认为是一个由软件和硬件构成的并行计算系统,其依赖于GPU的并行计算单元,CUDA有类C的API,方便程序编写.其依赖于CPU和GPU的异构体系,通过在CPU上串行执行环境初始化.内存分配. ...

  6. 20.Java基础_对象的构造函数

    package pack1; public class Student { private String name; private int age; //构造方法 //如果没有任何构造函数,系统会自 ...

  7. 【bzoj1941】[Sdoi2010]Hide and Seek(kd-tree)

    bzoj 题意: 给出\(n\)个点,对于每个点,\(d_i\)等于距离其最远的点的距离减去距离最近的点的距离.这里的距离为曼哈顿距离. 求\(min\{d_i\}\). 思路: 考虑直接对每个点暴力 ...

  8. C++ class外的 << 重载,输出流,重载示例。不应该定义类内的<<重载

    #include <iostream> // overloading "operator << " outside class // << 应该 ...

  9. Java:String,int相互转化

    int转String int a: a + “”    String.valueOf(a)    Interger.toString(a)    一般使用以上几种方法进行转化 第一种方法效率不好,ja ...

  10. insertAdjacentHTML和insertAdjacentText的使用(在指定位置插入代码或者文字)

    insertAdjacentText方法与insertAdjacentHTML方法类似,只不过只能插入纯文本,参数相同.