zoukankan      html  css  js  c++  java
  • 设计模式之三种工厂的区别与联系(五)

    前面已经学习简单工厂、工厂方法以及抽象工厂,本篇学习的是探究这三种工厂之间的区别与联系。

    在面向对象的设计中,对象的管理是其核心所在。其中,对象的创建是对象管理的第一步。对象的创建非常简单,在C#中,只需要使用new操作符调用对象的构造函数即可。因此,管理对象最重要的是掌握创建对象的时机。

    我们首先从对象的特征来看。代表抽象意义的类型,有接口和抽象类,但它们是不能创建对象实例的,这就意味着我们要创建的对象都是与具体的对象类型有关的。也就是说,创建对象的过程必将涉及设计中的实现细节,从而导致创建者与具体的被创建者之间的耦合增强。

    从而就引出了工厂三剑客了!

    简单工厂:提供一个创建对象实例的功能,而无需关心其具体的实现。

    在这里,被创建的对象可以是接口、抽象类,也可以是具体的类。

    通常情况下是用来创建接口的,但是也可以用来创建抽象类,甚至是一个具体的类实例。

    简单工厂的本质在于选择实现,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦。

    工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    首先,定义中的接口,不是编程里面的Interface,它是一个抽象的概念,你可以理解为“方法”。也就是说,定义一个用于创建对象的方法。这下,会对定义明白很多了。

    准确地说,工厂方法模式是将创建对象实例的责任,转移到了工厂类中,并利用抽象的原理,让实例化行为延迟到具体工厂类。

    工厂方法模式主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用;而具体的实现延迟到子类来实现。

    工厂方法模式的本质是延迟到子类来选择实现。

    工厂方法模式中的工厂方法,在真正实现的时候,一般是先选择使用哪一个具体的产品实现对象,然后创建这个具体产品对象的实例,最后就可以返回回去了。

    值得一提的是,引入工厂对象并不是简单地为产品创建相应的工厂,而是要划分各个模块不同的职责,将工厂对象的创建方法放在合适的地方。最佳的方案就是将创建工厂对象的职责集中起来,放到一个模块中,而不是在需要创建产品时,才创建工厂对象。

    抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    抽象工厂主要的两个问题点:一个是只知道所需要的一系列对象的接口,而不知道具体实现;

    另一个是这一系列对象是相关或者相互依赖的,也就是说既要创建接口对象,还要约束它们之间的关系。

    抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口,注意这个接口内的方法不是随意定义的,而是一系列相关或相互依赖的方法。

    抽象工厂的本质是选择产品簇的实现。

    抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是有联系的,它们都是产品的某一部分或者是相互依赖的

    三种工厂的区别与联系

    简单工厂和抽象工厂模式

    简单工厂是用来选择实现的,可以选择任意接口的实现。一个简单工厂的可以有多个用于选择并创建对象的方法,多个方法创建的对象可以是有关系的也可以是没关系的。

    抽象工厂模式是用来创建产品簇的实现的,也就是说一般抽象工厂里面有多个用于选择并创建对象的方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需要的部件对象。

    所以从某种意义上来说,简单工厂和抽象工厂是类似的,如果抽象工厂退化成为只有一个实现,不分层次,注意不分层次,那就相当于简单工厂了。

    简单工厂和工厂方法模式

    简单工厂和工厂也是类似的。

    工厂方法的本质也是用来选择实现的,与简单工厂的区别在于工厂方法是把选择具体实现的功能延迟到了子类。

    如果把工厂方法选择的实现方法父类直接实现,那就等同于简单工厂。

    工厂方法模式和抽象工厂模式

    工厂方法模式一般针对单独的产品对象的创建,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的。

    抽象工厂模式注重产品簇对象的创建,定义在抽象工厂里面的方法通常是有联系的,它们都是产品的某一部分或者相互依赖。

    当抽象工厂的产品簇只有一个产品时,抽象工厂也就退化成工厂了。

    在抽象工厂的实现中,还可以使用工厂方法来提供抽象工厂的具体实现,也就是说它们可以组合。

     下一篇,准备初步学习控制反转和依赖注入,也就是IOC/DI。

     注:只是读后笔记,版权归原作者所有。

  • 相关阅读:
    qt 数据库操作总结
    Pro*C编程研究一:从.pc到.exe
    通过OCCI连接oracle(C++)
    数据库操作通用类
    一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
    如何卸载oracle11g
    ORA-12541:TNS:无监听程序
    Qt 线程基础(QThread、QtConcurrent等) 2
    QThreadPool类和QtConcurrent命名空间
    AE 向已存在的要素类中添加字段
  • 原文地址:https://www.cnblogs.com/zxj159/p/3423650.html
Copyright © 2011-2022 走看看