zoukankan      html  css  js  c++  java
  • 设计模式--简单工厂VS工厂VS抽象工厂

       前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式。我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂。

       经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版。知道了它们之间的宏观关系,以下我带它们从一次次蜕变了解它们为什么是这种关系。

       我们最原始的代码思维是把所有的实现都放在一个类中。功能尽管是实现了,但耦合性非常高。非常不方便维护,好比活字印刷术之前的印刷,一个地方须要改动,则所有内容都须要推倒重来。

       简单工厂攻克了上述问题,简单工厂中的工厂类包括了必要的逻辑推断。依据client的选择条件动态实例化相关的类,其思路例如以下图所看到的。但它有个致命的缺点:违反开放-封闭原则。比方当须要创建“开方类”的时候,须要改动“简单工厂类”中的方法。

        

        工厂模式弥补简单工厂的不足,将一个类的实例化延迟到其子类。

    工厂方法把简单工厂的内部逻辑推断移到了client代码来进行,假设想要加入功能。仅仅需改动client就可以。

    比方加入“开方类”,仅仅需在运算类以下加入一个“开方类”,在抽象工厂以下加入一个“开方工厂”就可以。保证了开方-封闭原则。其思路例如以下图所看到的。

    但它的缺点是每加一个运算类。就须要加一个运算工厂的类,添加了额外的开发量。

         

          

       抽象工厂弥补了工厂模式的不足,抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。比方按工厂模式的思想,SqlserverUser类、AccessUser类、SqlDepartment类、AccessDepartment类须要四个工厂来创建。而抽象工厂对它们公共的部分进行了抽象,仅仅需两个工厂就能完毕相同需求,其思路例如以下图所看到的。它的还有一个长处是详细的创建实例过程与client分离,client通过抽象接口操纵实例。它的缺点是假设需求来自添加功能。比方我们要添加项目表Project,则至少须要添加三个类IProject、SqlserverProject、AccessProject。还须要更改IFactory、SqlserverFactory、AccessFactory才干够全然实现。要改动三个类,过程有点糟糕。

        

       简单工厂+抽象工厂弥补了抽象工厂的不足,用DataAccess类取代IFactory、SqlserverFactory、AccessFactory三个工厂类。在DataAccess类中,用反射+配置文件实现数据訪问,核心方法:Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”)。依据配置文件的keyword,动态创建类。其其思路例如以下图所看到的。

        

         事实上每种设计模式都有它的优缺点,我们必须在学习它们长处的同一时候也要考虑它们的缺点,这样才干在学习过程中游刃有余。

    但做人就不一样了,这里能够引用米老师的一句话: “假设仅仅是追寻一个人的缺点,慢慢别人的缺点也会成为自己的缺点。可是假设总是看别人的长处,慢慢别人的长处也成为自己的长处。”

           我希望我的解释能帮助你成长。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    URL重定向功能与APS.NET的固化功能结合
    How can I share types when generate WebSevice proxies using local paths
    C# Coding Standard Naming Conventions and Style
    VS自动化对象模型
    odac 如何捕捉错误odac 如何捕捉错误
    webbrower应用实例
    webbrower在同一个窗口打开新增窗口
    [DELPHI]$2501錯誤處理
    暴力破解例子
    webbrower连接在新form中显示
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4744737.html
Copyright © 2011-2022 走看看