• 【设计模式】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

  • 相关阅读:
    在Python中定义和使用抽象类的方法
    多数公司容易犯的5个大数据错误
    多数公司容易犯的5个大数据错误
    变“后发优势”为“现实优势” 时空大数据时代将临
    变“后发优势”为“现实优势” 时空大数据时代将临
    了解大数据在人力资源和薪资中的作用
    了解大数据在人力资源和薪资中的作用
    python数据结构之二叉树的统计与转换实例
    python数据结构之二叉树的统计与转换实例
    kafka,activemq rabbitmq.rocketmq的优点和缺点
  • 原文地址:https://www.cnblogs.com/zzk0/p/11218078.html
Copyright © 2020-2023  润新知