工厂顾名思义就是创立产品,实质就是用工厂办法代替 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 类图
总结出更形象的类图如下:
定义
形象工厂是工厂办法的升级版,为相干或者相互依赖的对象提供一个对立的接口,而且无需指定他们的具体实现类。
优缺点
-
长处
- 对产品族进行束缚,封装性好
-
毛病
- 产品族扩大艰难,增加一个产品须要批改形象和具体工厂类,违反开闭准则。
总结
简略工厂模式因为违反了泛滥设计准则,因而,很多时候会被视为是一种反模式而不是设计模式,然而因为面向对象设计语言中反射机制的存在,使得简略工厂模式应用的反而最为宽泛;
工厂办法尽管时最满足设计准则的,然而因为它会使零碎变得过于简单,因而,反而用的起码;
形象工厂模式更多体现的对产品族的束缚,同时,绝对于工厂办法模式,也升高了零碎的复杂度,极其状况下,如果形象工厂模式中的产品族只有一个产品,那么形象工厂模式也就进化成了工厂办法模式。因而,很多人说形象工厂模式是工厂的工厂,此观点是值得商讨的。
视频分享链接
更多内容请关注公众号: