关于设计模式:2-设计模式工厂模式

6次阅读

共计 1418 个字符,预计需要花费 4 分钟才能阅读完成。

工厂顾名思义就是创立产品,实质就是用工厂办法代替 new 操作创立一种实例化对象的形式。依据不同的实现形式和形象级别又可分为简略工厂,工厂办法和形象工厂三种模式。

案例


需要

封装一个 SqlHelper 类,实现对 SqlServer 的操作,且后续可能须要同时反对 SqlServer,MySql,Oracle 等支流数据库。

这是咱们平时十分相熟的需要了,依据需要咱们能够失去如下类图:

简略工厂


UML 类图

咱们将后面 SqlHelper 例子中的类图进行一次形象,就失去更通用的简略工厂模式类图了。其中对应关系如下:

  • Client:SqlHelper
  • SimpleFactory:DbConnectionFactory
  • AbstractProduct:DbConnection
  • Product1、Product2:SqlConnection、MySqlConnection

定义

简略工厂模式是由一个工厂对象决定创立出哪一种产品类的实例。因为简略工厂通常会应用静态方法实现,因而也叫做动态工厂模式,它不属于 23 种 GOF 设计模式之一。

优缺点

  • 长处

    • 实现了对责任的宰割,隔离了变动,因为它提供了专门的工厂类用于创建对象。
    • 通过配置文件,能够在不批改任何客户端代码的状况下更换和减少新的具体产品类,在肯定水平上进步了零碎的灵活性。
  • 毛病

    • 集中了所有实例的创立逻辑,违反了繁多职责准则
    • 扩大艰难,一旦增加新产品就不得不批改工厂逻辑,违反了开闭准则

工厂办法


案例改良

因为简略工厂模式不满足开闭准则,因而,咱们须要对其进行改良,将简略工厂进行一次形象,而后让每个具体的工厂子类负责生产对应的产品,具体改良如下:

UML 类图

同样的,咱们进行一次形象,就失去工厂办法模式的类图了。

定义

定义一个工厂父类,工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。行将类的实例化提早到工厂类的子类中实现,即由子类来决定应该实例化哪一个类。

优缺点

  • 长处:满足各种设计准则
  • 毛病:类的个数成倍增加,减少了零碎的复杂度

形象工厂


需要扩大(参数化查问)

当然,咱们晓得,工作中,更通用 SqlHelper 没有这么简略,比方,咱们至多须要参数化查问,避免用户的 SQL 脚本注入攻打。依据工厂办法模式的思路进一步改良,如下图所示:

不难发现,随着需要的减少,会呈现如下问题:

  • 类的数量成倍增长
  • 无奈保障类之间的依赖关系

改良

基于这些问题,咱们持续改良,将多个互相关联的工厂(DbConnect 和 DbParameter 应用时通常有密切联系)合并,失去如下类图:

UML 类图

总结出更形象的类图如下:

定义

形象工厂是工厂办法的升级版,为相干或者相互依赖的对象提供一个对立的接口,而且无需指定他们的具体实现类。

优缺点

  • 长处

    • 对产品族进行束缚,封装性好
  • 毛病

    • 产品族扩大艰难,增加一个产品须要批改形象和具体工厂类,违反开闭准则。

总结

简略工厂模式因为违反了泛滥设计准则,因而,很多时候会被视为是一种反模式而不是设计模式,然而因为面向对象设计语言中反射机制的存在,使得简略工厂模式应用的反而最为宽泛;

工厂办法尽管时最满足设计准则的,然而因为它会使零碎变得过于简单,因而,反而用的起码;

形象工厂模式更多体现的对产品族的束缚,同时,绝对于工厂办法模式,也升高了零碎的复杂度,极其状况下,如果形象工厂模式中的产品族只有一个产品,那么形象工厂模式也就进化成了工厂办法模式。因而,很多人说形象工厂模式是工厂的工厂,此观点是值得商讨的。

视频分享链接
更多内容请关注公众号:

正文完
 0