2,简单工厂模式

1,简单工厂

1,提前申明

  • 简单工厂不是一个标准的设计模式
  • 简单工厂非常常用,
  • 可以当做一个热身运动
    2,定义:
    提供一个创建对象实例的功能,而不需关心其具体实现。被创建实例的类型可以是接口,抽象类,也可以是具体类。

3,
在这里插入图片描述
Api:定义客户所需要的功能接口
Impl:具体实现Api的实现类
Factory:工厂,选择合适的实现类来创建Api接口对象
Client:客户端,通过Factory去获取Api接口对象,然后面向Api编程
4, 接口回顾

  • 接口是一个特殊的抽象类
  • 接口是用来干什么?定义实现类的外观,根据外部应用需要的功能,约定实现类应该要实现的功能
  • 接口的思想:封装隔离
  • 使用接口好处?只要接口不变。内部实现的变化就不会影响到外部应用,从而使得系统灵活,具有良好的扩展性和可维护性
  • 接口和抽象类的选择
    a,优先选用接口
    b,抽象类:既要定义子类的行为,又要为子类提供公共的功能(这个功能需要实现的)

5,面向接口编程
是Java编程的原则,Java设计中非常讲究层的划分和模块的划分,比如下面
在这里插入图片描述
表现层,逻辑层,数据层;层与层之间通过接口调用
在一个层内部各个模块也要通过接口。
不管是一层,模块,组件,都是一个被接口隔离的整体在这里插入图片描述

6 问题,既然Java中需要面向接口编程,那么在程序中到底如何使用接口,来做到真正的面向接口编程
不同模式的解决方案
在这里插入图片描述
问题:只知道接口而不知实现怎么办?

使用模式解决方案
在这里插入图片描述一个典型的疑问:new Impl移到简单工厂里面,不还是一样通new一个实现类来得到接口吗?把new Impl(),放到简单工厂和客户端的区别?
重点:理解简单工厂所在的位置
见3图
从客户端的角度只能看到接口,简单工厂的位置在封装体的内部(知道A,B的实现),起到了封装隔离的作用,工厂返回的是一个接口类型就可以了;

7,简单工厂的功能
可以用来创建的接口,抽象类,或者普通类的实例

8,通常把一个简单工厂类实现成一个工具类,直接使用静态方法即可,也就是说简单工厂的方法通常是静态的,所以也叫作静态工厂

9,万能工厂
一个简单工厂理论上可以用来构造任何对象

10,简单工厂创建对象的范围
建议控制在一个独立的组件级别或者一个模块级别

11,简单工厂的调用顺序
在这里插入图片描述
12 简单工厂命名建议

  • 类名:模块名称+Factory
  • 方法名称 : get+接口名称
  • 不建议把方法名称改为new+接口名称

13,简单工厂的方法写法
简单工厂方法内部主要实现的功能“选择合适的实现类来”来创建实例对象

  • 如何选择的问题
    * Impl ,Impl2
    * 如何选?》选择的参数是什么?>参数从何而来?==》
    * 1,参数来自客户端client
    * 2,参数来自配文件
    * 3,参数来自系统自身,比如运行期间某个值
    注意:如果从客户端在调用工厂的时候,传入选择的参数,这就说明客户端必须知道参数的意义,也需要理解每个参数对应得功能处理,这就要求在一定程度上,向客户暴露一定的内部实现细节。

解决:可配置简单工厂。由配置文件把要是用的数据传进来(Spring自动注入)使用反射加配置文件来实现新的实现类之后,无需修改代码,就能把这个新的实现类加到应用中

14,简单工厂的优缺点
a,帮助封装
b,解耦。(客户端和具体实现类,隔离)
c,可能增加客户端的复杂度(客户端传入参数的现象)
d,不方便扩展子工厂

15,简单工厂的本质:选择(重点)实现(预先做好的)

16,何时选用

  • 如果你想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取具体的接口,而不用关心具体实现
  • 如果想要对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多不相干对象,可以把对外创建对象的职责集中到一个简单工厂中,从而实现集中管理和控制

代码见git@github.com:qinixiangyang111/design.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道至简@EveryDay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值