设计模式之----工厂设计模式JAVA版

设计模式之----工厂设计模式JAVA版,第1张

设计模式之----工厂设计模式JAVA版 工厂设计模式 什么是简单工厂模式?

简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品的实例。简单工厂模式是工厂模式中最简单实用的模式。

简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为。

使用场景:在软件开发中,当我们会用到大量创建某种、某类或者某批对象时,(如:A用户发布动态/评论/回复等,B用户去点赞,这时就可以用上工厂模式)就会使用到工厂模式。

在Spring中的应用

实现方式:
BeanFactory。Spring中的BeanFactory就是简单工厂模式的具体表现,根据传入一个唯一的标识来获取Bean对象,但是是否在传入参数后创建还是在传入前创建这个要根据情况来定。

实质:
由一个工厂类根据传入的参数,动态的决定应该创建哪一个产品类。

实现:
bean容器的启动阶段:

  1. 读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。

  2. 然后通过BeanDefinitionRegistry将这些对象注册到beanFactory中,保存在一个ConcurrentHashMap中。

  3. 将BeanDefinition注册到beanFactory后,在这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor在此处来插入我们定义的代码。

    典型的列子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的。

容器中bean的实例化阶段:

实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点:

  1. 各种的Aware接口,比如:BeanFactoryAware,对于实现了Aware接口的bean,在实例化bean时Spring会帮我们注入对应的BeanFactory的实例。
  2. BeanPostProcessor接口,实现了它的接口的bean,在实例化bean时Spring会帮我们调用接口中的方法(重写了的方法postProcessBeforeInitialization()或postProcessAfterInitialization())。
  3. InitializingBean接口,实现了它的接口的bean,在实例化bean时Spring会帮我们调用接口中的方法(重写了的方法afterPropertiesSet())。
  4. DisposableBean接口,实现了这个接口的bean,在该bean死亡的时候Spring会帮我们调用接口中的方法(重写了的方法destroy())。

设计意义:
松耦合。 可以将原来的硬编码的依赖,通过Spring这个beanFactory这个工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引用了第三方–beanFactory,由它来解决bean之间的依赖问题,达到了松耦合的效果。

bean的额外处理。 通过spring的接口暴露,在实例化bean阶段我们可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的接口即可,那么spring就会在bean的生命周期调用我们实现的接口来处理该bean。

工厂方法模式
  1. 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
  2. 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。
    工厂方法模式将对象的实例化推迟到子类。

抽象工厂模式
  1. 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。
    程序员可以根据创建对象类型使用对应 的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

在Spring中的应用

实现方式: FactoryBean接口。

实现原理:实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是bean.getObject()方法的返回值。

例⼦:
例典型的例⼦有spring与mybatis的结合。

代码⽰例:


        
        
        
        
    

说明:
说我们看上⾯该bean,因为实现了FactoryBean接⼝,所以返回的不是 SqlSessionFactoryBean 的实例,⽽是它的 SqlSessionFactoryBean.getObject() 的返回值。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5687640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存