【从零学Spring入门到高级】Chapter6~7——GoF之工厂模式、Bean的获取方式

1.设计模式综述

设计模式:一种可以被重复利用的解决方案。

GoF (Gang of Four),中文名——四人组。

《Design Pattems E ements of Reusable Obiject-Oriented Software》(《设计模式》),1995年由Eich Gamma、Rchard Helm,Ralph Johnson 和John Vlssises台著。这几位作者常被称为"四人组(Gang of Four) "。该书中描述了23种设计模式。我们平常所说的设计模式就是指这23种设计模式。不过除了GoF23种设计模式之外,还有其它的设计模式,比如: JavaEE的设计模式(DAO模式、MVC模式等)。

GoF23种设计模式可分为三大类:

 

 工厂模式通常有三种形态:

  • ·第一种:简单工厂模式(Simple Factory):不属于23种设计模式之一。简单工厂模式又叫做:静态工厂方法模式。简单工厂模式是工厂方法模式的一种特殊实现,
  • ·第二种:工厂方法模式(Factory Method) :是23种设计模式之一。
  • ·第三种:抽象工厂模式(Abstract Factory) :是23种设计模式之一。

2.简单工厂模式

简单工厂模式的角色包括三个:·

  • 抽象产品角色
  • 具体产品角色
  • 工厂类角色

优点:客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要向工厂索要即可,初步实现了责任的分离。客户端只负责"消费",工厂负责”生产"。生产和消费分离。

缺点:假设现在需要扩展一个新的产品,工厂类的代码是需要修改的,显然违背了OCP原则;工厂类的责任比较重大,不能出现任何问题,因为这个工厂类负责所有产品的生产,称为全能类,或者有人把它叫做上帝类,这个工厂类一旦出问题,整个系统必然全部瘫痪。(不要把所有鸡蛋放到一个篮子里面哦。)

 3.工厂方法模式

 工厂方法模式可以解决简单工厂模式当中的OCP问题:一个工厂对应生产一种产品。这样工厂就不是全能类了。另外,也可以符合OCP原则。

工厂方法模式中的角色:

  • *抽象产品角色
  • *具体产品角色
  • *抽象工厂角色
  • *具体工厂角色

 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

优点:当你扩展一个产品的时候,符合OCP原则,因为只需要添加两个类,一个类是具体产品类,一个类是具体工厂类。都是添加类,没有修改之前的代码,所以符合OCP。

进入第7章

Spring为Bean提供了多种实例化/获取方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活)

  • ·第一种:通过构造方法实例化
  • ·第二种:通过简单工厂模式实例化
  • ·第三种:通过factory-bean实例化
  • ·第四种:通过FactoryBean接口实例化

 一开始用的就是第一种方式,在配置文件中写入bean即可,不再赘述。

4.通过简单工厂模式实例化

 factory-method属性指定的是工厂类当中的静态方法。也就是告诉Spring框架,调用这个方法可以获取Bean。

5.通过factory-bean实例化

(该方法不是很明白)

 

下图所示工厂的方法不是静态的

 

 6.通过FactoryBean接口实例化

以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。

 

 7.BeanFactory和FactoryBean的区别

1.BeanFactory

Spring loC容器的顶级对象,BeanFactory被翻译为“Bean工厂”,在Spring的loC容器中,“Bean工厂”负责创建Bean对象。BeanFactory是工厂。
 

2.FactoryBean

FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。

8.FactoryBean应用练习

我们前面说过, java.util.Date在Spring中被当做简单类型,简单类型在注入的时候可以直接使用valbe属性或vacbe标签来完成。但我和们之前已经狐试过了,对于Date类型来说,采value属性或value标签赋值的时候,对日期字符串的格式要求非常严格,必须是这种格式的: Mon Oct 101430:26 CST 2022。其他格式是不会被识别的。 

学生类

 

 

猜你喜欢

转载自blog.csdn.net/m0_48385518/article/details/128649004