创建型设计模式-工厂模式和应用

工厂模式介绍:

  • 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

例子:

  • 需要购买一辆车,不用管车辆如何组装,且可以购买不同类型的比如轿车、SUV、跑车,直接去4s店购买就行(4s店就是工厂)
  • 工厂生产电脑,除了A品牌、还可以生产B、C、D品牌电脑
  • 业务开发中,支付很常见,里面有统一下单和支付接口,具体的支付实现可以微信、支付宝、银行卡等

工厂模式有 3 种不同的实现方式

  • 简单工厂模式:通过传入相关的类型来返回相应的类,这种方式比较单 一,可扩展性相对较差;
  • 工厂方法模式:通过实现类实现相应的方法来决定相应的返回结果,这种方式的可扩展性比较强;
  • 抽象工厂模式:基于上述两种模式的拓展,且支持细化产品

应用场景:

  • 解耦:分离职责,把复杂对象的创建和使用的过程分开

  • 复用代码 降低维护成本:

    • 如果对象创建复杂且多处需用到,如果每处都进行编写,则很多重复代码,如果业务逻辑发生了改变,需用四处修改;
    • 使用工厂模式统一创建,则只要修改工厂类即可,降低成本

一、简单工厂模式的应用

简单工厂模式

  • 又称静态工厂方法, 可以根据参数的不同返回不同类的实例,专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

  • 由于工厂方法是静态方法,可通过类名直接调用,而且只需要传入简单的参数即可

 实现代码如下

 public static PayFactory createPay(String payType){if (payType == null){return null;}else if(payType.equalsIgnoreCase("WECHAT_PAY")){return new WechatPay();}else if(payType.equalsIgnoreCase("ALI_PAY")){return new AliPay();}return null;}
        Pay pay = SimplePayFactory.createPay("ALI_PAY");pay.unifiedorder();

优点:

  • 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。

缺点

  • 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背
  • 即开闭原则(Open Close Principle)对扩展开放,对修改关闭,程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果
  • 将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度,不利于系统的扩展和维护,创建简单对象就不用模式

二、工厂方法模式的应用

工厂方法模式

  • 又称工厂模式,是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
  • 通过工厂父类定义负责创建产品的公共接口,通过子类来确定所需要创建的类型
  • 相比简单工厂而言,此种方法具有更多的可扩展性和复用性,同时也增强了代码的可读性
  • 将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化哪一个类。

代码如下

*** 抽象工厂方法*/
public interface PayFactory {
​Pay getPay();
}
​
/*** 具体产品工厂*/
public class AliPayFactory implements PayFactory {@Overridepublic Pay getPay() {return new AliPay();}
}
​
/*** 抽象产品*/
public interface Pay {/*** 统一下单*/void unifiedorder();
}
​
/*** 具体产品*/
public class AliPay implements Pay {
​@Overridepublic void unifiedorder() {System.out.println("支付宝支付 统一下单接口");}
}

运行效果如下

 如果需要拓展微信支付:

//创建微信支付方法对象的工厂
public class WechatFactory implements PayFactory{@Overridepublic Pay getPay() {return new WechatPay();}
}//微信支付的方法
public class WechatPay implements Pay{@Overridepublic void unifiedorder() {System.out.println("微信支付被调用");}
}

运行效果如下

缺点:

  • 增加一个产品,需要实现对应的具体工厂类和具体产品类;
  • 每个产品需要有对应的具体工厂和具体产品类

三、抽象工厂方法模式的实践指南和应用

抽象工厂模式:基于上述两种模式的拓展,是工厂方法模式的升级版,当需要创建的产品有多个产品线时使用抽象工厂模式是比较好的选择

  • 抽象工厂模式在 Spring 中应用得最为广泛的一种设计模式

背景

  • 工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题
  • 但工厂方法模式中每个工厂只创建一类具体类的对象,后续发展可能会导致工厂类过多,因此将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,强调的是一系列相关的产品对象!!!

实现步骤

1、定义两个接口 Pay、Refund
2、创建具体的Pay产品、创建具体的Refund产品
3、创建抽象工厂 OrderFactory 接口
  里面两个方法 createPay/createRefund
4、创建支付宝产品族AliOderFactory,实现OrderFactory抽象工厂
5、创建微信支付产品族WechatOderFactory,实现OrderFactory抽象工厂
6、定义一个超级工厂创造器,通过传递参数获取对应的工厂

代码如下

/*** 超级工厂,定义同个产品族的其他相关子工厂*/
public interface OrderFactory {PayFactory createPay();RefundFactory createRefund();
}
​
//产品族工厂的产品,可以不叫Factory,看公司团队规范,比如类名叫 IPay 也可以的
public interface PayFactory {/*** 统一下单*/void unifiedorder();
}
​
//产品族工厂
public class AliOrderFactory implements OrderFactory {
​@Overridepublic PayFactory createPay() {return new AliPay();}@Overridepublic RefundFactory createRefund() {return new AliRefund();}
}
​
//具体产品
public class AliPay implements PayFactory {@Overridepublic void unifiedorder() {System.out.println("支付宝支付 统一下单接口");}
}
​
​
//超级工厂生产器,传参生产对应的子工厂
public class FactoryProducer {public static OrderFactory getFactory(String type) {if (type.equalsIgnoreCase("WECHAT")) {return new WechatOrderFactory();} else if (type.equalsIgnoreCase("ALI")) {return new AliOrderFactory();}return null;}
}
​

运行效果如下

  • 工厂方法模式和抽象工厂方法模式

    • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,抽象工厂模式退化成工厂方法模式
    • 优点
      • 当一个产品族中的多个对象被设计成一起工作时,它能保证使用方始终只使用同一个产品族中的对象
      • 产品等级结构扩展容易,如果需要增加多一个产品等级,只需要增加新的工厂类和产品类即可, 比如增加银行支付、退款
  • 缺点

    • 产品族扩展困难,要增加一个系列的某一产品,既要在抽象的工厂和抽象产品里修改代码,不是很符合开闭原则

    • 增加了系统的抽象性和理解难度

二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)相关推荐

  1. 简单工厂 工厂方法 抽象工厂 如何理解

    文章目录 前言 一.简单工厂 二.工厂方法 三.抽象工厂 总结 前言 简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入. 提示:以下是本篇文章正 ...

  2. 简单工厂-工厂方法-抽象工厂

    目录 简单工厂 工厂方法 抽象工厂 前言 之前看书认真了解过这三种模式,但因为没有做记录,都给忘完了.现在重新分析网上的博客发现跟书里讲的不太一样,哎-.现在能做的就是把现在的理解给记录一下,若以后有 ...

  3. java 三种工厂模式(简单工厂+工厂方法+抽象工厂)

    一.简单工厂模式 概述   简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的 实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因 ...

  4. 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

    一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...

  5. 简单工厂/工厂方法/抽象工厂

    1 简单工厂 根据参数由工厂类来创建对象 /*** 简单工厂* 目的:根据参数获取对象* 缺点:新增实现类时,需要修改代码,不好动态扩展(可参考工厂方法)*/ public class SimpleF ...

  6. 建造者模式 生成器模式 创建型 设计模式(五)

    建造者模式 Builder 也叫做生成器模式 在正式开始建造者模式之前,先回顾下抽象工厂模式 本人的所有系列文章都是自己学习的记录过程,均有比较严格的先后顺序,如果不清楚抽象工厂模式可以先往前翻翻 从 ...

  7. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

    园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...

  8. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...

  9. 设计模式学习笔记——03 简单工厂 工厂方法 抽象工厂

    简单工厂 简单工厂模式也成静态工厂模式,但此模式不符合开闭原则,但仍然很常用 适用范围:工厂类需要创建的对象种类比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 上段代码: p ...

最新文章

  1. Linux定时程序没有之行完,如何在linux上定时执行程序
  2. 左右躲避障碍-神手ts版本
  3. Shell教程(四):条件语句、循环语句、break/continue
  4. GDCM:gdcm::Filename的测试程序
  5. 深度学习 Caffe 初始化流程理解(数据流建立)
  6. 004. ES6之函数的扩展
  7. Android反编译方法
  8. 习题4.5 顺序存储的二叉树的最近的公共祖先问题 (25 分)
  9. C语言课程设计之图书管理系统
  10. Gsonformat插件安装与使用
  11. 剖析STM32F103读写W25Q64
  12. 我的盖洛普“优势识别器”测试报告
  13. 手机网页底部广告代码,悬浮底部广告,带关闭开关,复制文字,按钮
  14. ttl一会255一会64_什么是TTL 生存时间?Ping TTL的含义
  15. web安全:QQ号快速登录漏洞及被盗原理
  16. Java异常处理中throw与throws的用法区别
  17. 神奇的幻方(洛谷)c语言
  18. 一些PPT演讲前暖场的音乐
  19. MySql数据库:数据查重、去重的实现
  20. LeetCode题解汇总

热门文章

  1. 翻译程序:将高级语言翻译成机器语言
  2. 苹果开发测试设备达到100台上限
  3. Android应用优化之最基本的UI层显示优化
  4. 信息检索与排序模型之布尔模型
  5. 给你一台小车车,怎么让它自动驾驶起来?
  6. 防控入侵害虫,一场无硝烟的战争
  7. TCP的ACK机制学习日志
  8. linux的spawn权限不足,linux expect, spawn自动登录
  9. Servlet是单例还是多例
  10. 基于Darknet的YOLOv4目标检测