深入理解 设计模式之工厂模式

2023-03-26 17:47:21 浏览数 (1)

总结

简言之,客户需要产品时找工厂要,而不是客户自己要产品。前者客户只需要 "向工厂申请产品"的接口,后者客户需要"申请产品1", "申请产品2"等多个接口。

工厂模式体现了程序设计中的:

  • 依赖倒转原则 (抽象依赖抽象,在抽象工厂模式中有体现)
  • 最小知识原则? (客户只和工厂打交道)

不知名原则:

  • 以代码量换取扩展性 (俺自己起的不行嘛.....)

思考

  • 工厂模式想解决的问题:有较多产品时,与其让客户接触杂乱的产品接口,不如接触一个工厂接口,通过工厂访问产品。
  • 工厂模式面对的问题:随着产品的增加,工厂的负担加重。如果工厂过于"全能",其生产产品的方法会冗长;如果工厂过于"术业有专攻",工厂的数量将接近于产品的数量,代码二倍增长。
  • 站在客户的角度,工厂模式是简约的;站在开发者的角度,工厂模式是繁琐的。相比于简单工厂模式,工厂方法模式扩展性更强,是以代码量换取扩展性。
  • 感觉这是面向过程思考出的结果,如果只是面向对象,很难将对象抽象出工厂模式。

简单工厂模式

要素:具体工厂类,抽象产品类,具体产品1类,具体产品2类。

  • 具体产品1类:比如 福田车;
  • 具体产品2类:比如 广汽车;
  • 抽象产品类:比如 车,是上两个的父类。提供 刹车 等虚函数;
  • 抽象工厂类:比如 汽车工厂,提供 生产车辆 的方法,根据传入参数,决定生产的产品类型。

客户使用时需要:

  1. 创建 汽车工厂对象
  2. 汽车工厂对象 调用 生产车辆 的方法 (传入参数为 福田时,汽车工厂.生产车辆("福田"));
  3. 得到 福田车对象

工厂方法模式

在"简单工厂模式"中,汽车工厂类 过于抽象,随着产品种类的增加,汽车工厂类中的生产车辆方法将变得十分臃肿。如果有 福田车工厂类广汽车工厂类更好,这样一个工厂生产一种汽车,增加一种汽车就增加对应工厂生产它。于是改进为:

  • (具体产品类) 福田车类;
  • (具体产品类) 广汽车类;
  • (抽象产品类) 车类;
  • (抽象工厂类) 汽车工厂类;
  • (具体工厂类) 福田车工厂类;
  • (具体工厂类) 广汽车工厂类;

客户使用时需要:

  1. 根据传入参数决定将 汽车工厂类对象初始化为福田车工厂还是广汽车工厂
  2. 福田车工厂对象 调用 生产车辆方法
  3. 得到 福田车对象

抽象工厂模式

在"工厂方法模式"中,每增加一种具体产品,就增加一种具体工厂,开发成本大。但是抽象工厂模式不是为了解决这个问题滴(我是这么理解的,欢迎纠错)。比如 我想买 巧克力饼干,希望有一个巧克力饼干工厂,这个工厂同时依赖巧克力类饼干类(前两种模式中工厂只依赖一种产品类,此处依赖多种产品类),提供生产巧克力生产饼干的接口。

客户使用时需要:

  1. 初始化 巧克力饼干工厂对象
  2. 该对象调用生产巧克力生产饼干的接口;
  3. 得到巧克力对象饼干对象
  4. (同时吃巧克力和饼干得到巧克力饼干);

0 人点赞