当前位置:首页>文章>java工厂设计模式详解(java和python的区别)

java工厂设计模式详解(java和python的区别)

前言 今天来和小伙伴们分享下设计模式中的工厂模式啦 一、工厂模式 我们都知道,设计模式有23种,按照功能和使用场景可以分为三大类: 创建型模式结构型模式行为型模式 工厂设计模式(FactoryPattern)呢,就是一种很常见的设计模式,属于创建型模式的,主要作用就是来创建对象的~ 原理图 先来看一个小栗子 二、简单工厂模式(非23种) 原理图 ​ 例子的话,感觉也挺多的比如各种品牌的电脑呀,手机...

前言

今天来和小伙伴们分享下设计模式中的工厂模式

java工厂设计模式详解(java和python的区别)

一、工厂模式

我们都知道,设计模式有23种,按照功能和使用场景可以分为三大类:

  • 创建型模式
  • 结构型模式
  • 行为型模式

工厂设计模式(Factory Pattern)呢,就是一种很常见的设计模式,属于创建型模式的,主要作用就是来创建对象的~

原理图

java工厂设计模式详解(java和python的区别)

先来看一个小栗子

二、简单工厂模式(非23种)

原理图

java工厂设计模式详解(java和python的区别)

例子的话,感觉也挺多的 比如各种品牌的电脑呀,手机呀,家具呀……

比如笔记本电脑的例子

抽取公共接口

这里就只提供一个返回品牌的接口

public interface ILaptop {
    String brand();
}1.2.3.

接口实现类

这里就举两个例子~

public class HuaWeiLaptop implements ILaptop{
    @Override
    public String brand() {
        return \"HuaWei\";
    }
}
​
public class MacLaptop implements ILaptop {
    @Override
    public String brand() {
        return \"Mac\";
    }
}1.2.3.4.5.6.7.8.9.10.11.12.13.

工厂类

最主要的就是这个工厂类了,我们把创建对象的能力将给它~

public class LaptopFactory {
​
    public static ILaptop createLaptop(String brand){
        switch (brand){
            case \"HuaWei\":
                return new HuaWeiLaptop();
            case \"Mac\":
                return new MacLaptop();
            default:
                return null;
        }
    }
}1.2.3.4.5.6.7.8.9.10.11.12.13.

测试

就这样,我们就简单的完成了一个工厂模式的应用了~ ,以后创建对象就直接调用工厂的方法就可以了

public class LaptopMain {
    public static void main(String[] args) {
        ILaptop hw = LaptopFactory.createLaptop(\"HuaWei\");
        String brand = hw.brand();
        System.out.println(brand);
    }
}1.2.3.4.5.6.7.

当然,这个是最简单的工厂模式例子了,也叫做 简单工厂模式

当然这个也有很明显的弊端,所以我们再来看看这个 工厂方法模式

三、工厂方法模式

原理图

java工厂设计模式详解(java和python的区别)

想想简单工厂的写法,将创建对象的所有操作都封装在一个工厂里,是不合理的,所以我们要进一步解耦

抽取工厂公共接口

public interface ILaptopFactory {
    ILaptop createLaptop();
}1.2.3.

工厂实现类

public class HuaweiLaptopFactory implements ILaptopFactory{
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}1.2.3.4.5.6.

测试

简单改动上面测试案例的前两句代码即可

 HuaweiLaptopFactory huaweiLaptopFactory = new HuaweiLaptopFactory();
 ILaptop mac =  huaweiLaptopFactory.createLaptop();1.2.

是不是很简单的就完成了这个工厂模式了

四、抽象工厂模式

原理图

java工厂设计模式详解(java和python的区别)

那么工厂嘛,肯定不止一条生产线,它肯定有其他的业务,比如手机呀,其他电器啥的。

所以我们再重复上面笔记本产品的例子,再建一些其他类,然后也通过工厂类去创建它即可。

抽象工厂

先定义一个抽象工厂

public abstract class AbstractFactory {
    public abstract IPhone createPhone();
    public abstract ILaptop createLaptop();
}1.2.3.4.

工厂实现类

也就多了一个而已呀~

public class HuaweiFactory extends AbstractFactory{
    @Override
    public IPhone createPhone() {
        return new HuaWeiPhone();
    }
​
    @Override
    public ILaptop createLaptop() {
        return new HuaWeiLaptop();
    }
}1.2.3.4.5.6.7.8.9.10.11.

五、小结

在使用工厂模式时,我们可以发现从 简单工厂(非23种) ——》 工厂方法 ——》抽象工厂

这是一个不断扩展,解耦的过程,我们可以在项目种根据需要进行选择~

比如 产品多的话就选抽象工厂,单一的话就直接用工厂或者简单工厂就可以了

至此,我们了解到工厂模式是属于23中设计模式中的创建型模式,主要用途就是创建对象,同时方便程序解耦。

接着,我们再来想想 Spring 中和工厂模式有关的

说到这里,你想到什么了呢?

不知道的话,就默念 Factory,Factory,Factory,哈哈哈~

是不是脑海中一下子浮现出来了这两货

  • BeanFactory
  • FactoryBean

从名字就可以看出这两货和工厂有关 (分别通过 getBean 和 getObject 获取对象)

那么我们先来介绍下他们叭

六、BeanFactory

源码的第一句话

The root interface for accessing a Spring bean container. (IOC的根接口)

可以发现它是非常核心的组件

遵循严格的生命周期

java工厂设计模式详解(java和python的区别)

可以发现,通过 BeanFactory 创建一个 Bean 要经过非常严格的流程处理,很繁琐。

方法

java工厂设计模式详解(java和python的区别)

方法有很多,比如 获取别名呀,类型呀,是否是单例,原型等

通过 getBean 去获取对象

主要作用

根据 BeanDefinition 生成相应的 Bean 对象。

java工厂设计模式详解(java和python的区别)

七、FactoryBean

源码

可以发现就这么三个方法,一个小工厂

java工厂设计模式详解(java和python的区别)

通过 getObject 方法来返回一个对象

获取对象时:

  • 如果 beanName 没有加 & 号,则获取的是泛型T 的对象。
  • 如果添加了 & 号,获取的是实现了 FactoryBean 接口本身的对象,如 EhCacheFactoryBean

而正因为它的小巧,它也被广泛的应用在Spring内部,以及Spring与第三方框架或组件的整合过程中。

八、BeanFactory 和 FactoryBean 的区别是什么?

  • BeanFactory 是一个大工厂,是IOC容器的根基,有繁琐的 bean 生命周期处理过程,可以生成出各种各样的 Bean
  • FactoryBean 是一个小工厂,它自己也是一个 Bean ,但是可以生成其他 Bean​

最后一个问题

九、Spring中工厂模式的使用

既然都和工厂有关,那么我们就挑个软柿子捏一下

FactoryBean工厂模式图

java工厂设计模式详解(java和python的区别)

可以发现和我们上面介绍的工厂方法模式一样,公共接口和不同的实现类,通过具体的工厂获取对象。

BeanFactory 也是类似的,就不画啦

十、总结

画个图总结下啦

java工厂设计模式详解(java和python的区别)

最后

Spring相关资料:

java工厂设计模式详解(java和python的区别)

Spring笔记-176页的知识核心整理

java工厂设计模式详解(java和python的区别)

另外还整理成了40多套PDF文档:全套的Java面试宝典手册,“性能调优+微服务架构+并发编程+开源框架+分布式”等七大面试专栏,包含Tomcat、JVM、MySQL、SpringCloud、SpringBoot、Dubbo、并发、Spring、SpringMVC、MyBatis、Zookeeper、Ngnix、Kafka、MQ、Redis、MongoDB、memcached等等。如果你对这个感兴趣,小编可以免费分享。

给TA打赏
共{{data.count}}人
人已打赏
文章

mc皮肤站怎么用(手机制作mc动画的方法)

2022-5-3 10:47:37

文章

会声会影好用吗有水印吗(分享好用的手机视频剪辑软件)

2022-5-3 10:47:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索