前言今天来和小伙伴们分享下设计模式中的工厂模式啦设计模式
顺便带来了下面三个问题,一块儿来看看吧框架
咱们都知道,设计模式有23种,按照功能和使用场景能够分为三大类:ide
工厂设计模式(Factory Pattern)呢,就是一种很常见的设计模式,属于建立型模式的,主要做用就是来建立对象的~测试
先来看一个小栗子spa
二.简单工厂模式(非23种)
例子的话,感受也挺多的 好比各类品牌的电脑呀,手机呀,家具呀……设计
好比笔记本电脑的例子code
这里就只提供一个返回品牌的接口对象
public interface ILaptop { String brand(); }
这里就举两个例子~blog
public class HuaWeiLaptop implements ILaptop{ @Override public String brand() { return "HuaWei"; } } public class MacLaptop implements ILaptop { @Override public String brand() { return "Mac"; } }
最主要的就是这个工厂类了,咱们把建立对象的能力将给它~接口
public class LaptopFactory { public static ILaptop createLaptop(String brand){ switch (brand){ case "HuaWei": return new HuaWeiLaptop(); case "Mac": return new MacLaptop(); default: return null; } } }
就这样,咱们就简单的完成了一个工厂模式的应用了~ ,之后建立对象就直接调用工厂的方法就能够了
public class LaptopMain { public static void main(String[] args) { ILaptop hw = LaptopFactory.createLaptop("HuaWei"); String brand = hw.brand(); System.out.println(brand); } }
固然,这个是最简单的工厂模式例子了,也叫作 简单工厂模式
固然这个也有很明显的弊端,因此咱们再来看看这个 工厂方法模式
三.工厂方法模式
想一想简单工厂的写法,将建立对象的全部操做都封装在一个工厂里,是不合理的,因此咱们要进一步解耦
public interface ILaptopFactory { ILaptop createLaptop(); }
public class HuaweiLaptopFactory implements ILaptopFactory{ @Override public ILaptop createLaptop() { return new HuaWeiLaptop(); } }
简单改动上面测试案例的前两句代码便可
HuaweiLaptopFactory huaweiLaptopFactory = new HuaweiLaptopFactory(); ILaptop mac = huaweiLaptopFactory.createLaptop();
是否是很简单的就完成了这个工厂模式了
四.抽象工厂模式
那么工厂嘛,确定不止一条生产线,它确定有其余的业务,好比手机呀,其余电器啥的。
因此咱们再重复上面笔记本产品的例子,再建一些其余类,而后也经过工厂类去建立它便可。
先定义一个抽象工厂
public abstract class AbstractFactory { public abstract IPhone createPhone(); public abstract ILaptop createLaptop(); }
也就多了一个而已呀~
public class HuaweiFactory extends AbstractFactory{ @Override public IPhone createPhone() { return new HuaWeiPhone(); } @Override public ILaptop createLaptop() { return new HuaWeiLaptop(); } }
在使用工厂模式时,咱们能够发现从 简单工厂(非23种) ——》 工厂方法 ——》抽象工厂
这是一个不断扩展,解耦的过程,咱们能够在项目种根据须要进行选择~
好比 产品多的话就选抽象工厂,单一的话就直接用工厂或者简单工厂就能够了
至此,咱们了解到工厂模式是属于23中设计模式中的建立型模式,主要用途就是建立对象,同时方便程序解耦。
接着,咱们再来想一想 Spring
中和工厂模式有关的
说到这里,你想到什么了呢?
不知道的话,就默念 Factory,Factory,Factory …… 哈哈哈
是否是脑海中一会儿浮现出来了这两货
BeanFactory
FactoryBean
从名字就能够看出这两货和工厂有关 (分别经过 getBean
和 getObject
获取对象)
那么咱们先来介绍下他们叭
六.BeanFactoryThe root interface for accessing a Spring bean container. (IOC的根接口)
能够发现它是很是核心的组件。
能够发现,经过 BeanFactory
建立一个 Bean
要通过很是严格的流程处理,很繁琐。
方法有不少,好比 获取别名呀,类型呀,是不是单例,原型等
经过 getBean
去获取对象
根据 BeanDefinition
生成相应的 Bean
对象。
能够发现就这么三个方法,一个小工厂
经过 getObject
方法来返回一个对象
获取对象时:
beanName
没有加 &
号,则获取的是泛型T 的对象。&
号,获取的是实现了 FactoryBean
接口自己的对象,如 EhCacheFactoryBean
而正由于它的小巧,它也被普遍的应用在Spring内部,以及Spring与第三方框架或组件的整合过程当中。
八.BeanFactory 和 FactoryBean 的区别是什么?BeanFactory
是一个大工厂,是IOC容器的根基,有繁琐的 bean
生命周期处理过程,能够生成出各类各样的 Bean
FactoryBean
是一个小工厂,它本身也是一个 Bean
,可是能够生成其余 Bean
最后一个问题
九.Spring中工厂模式的使用既然都和工厂有关,那么咱们就挑个软柿子捏一下
能够发现和咱们上面介绍的工厂方法模式同样,公共接口和不一样的实现类,经过具体的工厂获取对象。
BeanFactory
也是相似的,就不画啦
画个图总结下啦