Spring中Bean采用工厂设计的意义

工厂设计模式有什么用

要回答这个问题,首先要知道为什么要有工厂设计模式,我们拿具体的代码来举例说明:

  • 我们经常一些功能类似的类,所以我们的思路是对进行抽象,使用接口暴露公共的方法,使用抽象类来提供公共的实现。
public interface IProduct {
    void print(); // 这是要暴露的方法
}

public abstract class AbstractProduct implements IProduct {
    protected void printBefore(){
        System.out.println("before print"); // 这里所公共的实现
    }
}

public class AProduct extends AbstractProduct {
    private String name;
    public AProduct(String name){ 
        this.name = name;
    }
    @Override
    public void print() {
        this.printBefore();
        System.out.println("print A >>>"+name);
    }
}

public class BProduct extends AbstractProduct {
    private String name;
    public BProduct(String name){ 
        this.name = name;
    }
    @Override
    public void print() {
        this.printBefore();
        System.out.println("print B >>>"+name);
    }
}
  • 这些功能类似的类的实例化成为了一个问题,每个类的构造方法参数还不一样,每次 new 对象很麻烦,封装成简单工厂模式
public class SimpleFactory {
    public static IProduct getProduct(String name){
        if("A".equals(name)){
            return new AProduct(name);
        }else if("B".equals(name)){
            return new BProduct(name);
        }else{
            throw new IllegalArgumentException();
        }
    }
}
  • 简单工厂模式不利于拓展,违背了**开闭原则**,每次添加一个类,都要修改工厂类(如果是工厂类和业务类是两个小伙伴分开写的,那不是要花很多时间来沟通...),所以就有工厂方法模式,其原理就是对简单工厂也进行抽象。
public interface IFactory {
    IProduct getProduct();
}

public class AFactory implements IFactory {
    @Override
    public IProduct getProduct() {
        return new AProduct(AProduct.class.getName());
    }
}

public class BFactory implements IFactory {
    @Override
    public IProduct getProduct() {
        return new BProduct(BProduct.class.getName());
    }
}
  • 突然发现有些糟糕了,因为代码变得很多了,因为功能类似的产品我们进行 3 层抽象,针对每个产品我们还抽象出了 2 层的工厂类。但是我们在某个具体的业务场景中,不单单是只实例化一个类啊。举一个例子,在游戏中,我们要一个战士配装备,首先我们需要配一把枪械(枪械有很多,步枪,狙击枪等,使用问题 1 进行抽象),但是配了枪械之后,我们还需要配子弹啊(继续使用问题 1 的方法进行抽象),好了,现在可以抽象出 2 层的工厂类了,针对现在的情况我们是不是可以让一个工厂既生产枪械,又生产子弹呢? 这就是抽象工厂模式。简单来说,可以把有一些有联系或者相近的产品,放到一个工厂去生产,没有必要单独再开一个工厂了

new Foo(new Ifactory<Integer>(){
        Integer create(){
            return new Integer(0);
        }
    });

    new Foo(new Ifactory<String>(){
        String create(){
            return "Hello";
        }
    });

Spring中的工厂模式

Spring创建对象实现原理:

根据配置文件的id得到对应的class属性值,根据反射,通过类全路径创建对象;
通过配置文件,通过工厂设计模式,有反射动态创建对象

Spring 框架就利用工厂设计模式对Service和DAO进行解耦合

思路:将对象的创建交给工厂完成,工厂读取小配置文件,获取要创建对象的全限定名,利用反射创建类的对象并发返回给调用者

  1. 编写小配置文件,存放需要由工厂创建对象的全限定名

  2. 创建一个类BeanFactory (对象工厂,工厂设计模式的核心类)
    bean(对象) Factory(工厂)
    1.1 使用静态代码块加载读取小配置文件
    1.2 创建一个方法创建开发者需要的对象
    如下图所示:

     

  3. 在业务逻辑层中,将自己创建对象的代码删掉,交给工厂创建

     

如此,就把我们的Service和Dao进行了解耦合,使得Dao实现类的创建不再在程序中创建,而是通过读取配置文件来创建。这样的解耦合使得程序更灵活,

小结

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jchb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值