设计模式——工厂方法模式

75 阅读2分钟

一.定义

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

二.类图

image.png

  • Product抽象产品类。负责定义产品的共性,实现对事物最抽象的定义。
  • Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类由具体的实现工厂ConcreteCreator完成。

三.优点

  • 良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品类名(约束字符串)就可以了,不用知道创建对象的艰幸过程,降低模块间的耦合。
  • 扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
  • 工厂方法模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。

四.使用场景

  • 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是增加工厂类管理,也会增加代码的复杂度。
  • 在需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。如需要设计一个连接邮件服务器的框架,有三种协议可选择:POP3、IMAP、HTTP,我们就可以把三种连接方法作为产品类,定义一个接口如IConnectMail,然后定义对邮件的操作方法,用不同的方法实现三个具体的产品类(也就是连接方式),定义一个工厂方法,按照不同的传入条件,选择不同的连接方法,如需要提供WebService接口,只要增加一个产品类就可以了。

五.扩展

  • 静态工厂模式。若只需要一个工厂类,则不需要Product抽象类,使用静态方法即可。
  • 多工厂模式。多个对象初始化时流程过多,放在一个工厂中会使代码结构不清晰,则需要设计多个工厂类满足需求。
  • 替代单例模式。
  • 延迟初始化。延迟初始化含义为一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用。延迟加载框架是可以扩展的,例如限制某一个产品类的最大实例化数量,定义一个Map容器,通过判断Map中已有的对象数量来实现。例如JDBC连接数据库,都会要求设置一个MaxConnctions最大连接数量,该数量就是内存中最大实例化的数量。