工厂模式及在Spring中的应用

工厂模式是最基本的也是最重要的模式,因为它方便我们能写出高质量、高效率的代码。只有掌握了工厂模式,我们才不会重复造轮子。今天将从最简单的工厂模式开始一步步深入讲解,告诉大家自己写是怎么用的,框架又是如何实现,我们能从框架实现获得怎么样的灵感。

首先看看工厂模式的类图:

工厂模式类图

工厂模式由一个接口类加一个对应的工厂类实现的,接口类提供所有要创建出来的实体所需要的方法,工厂类只负责一件事:创建实现类的对象的方法。

先提供出接口类和实现类:

public interface ICar {
    void getBrand();
}
public class Audi implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Audi.class.getSimpleName());
    }
}
public class Benz implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Benz.class.getSimpleName());
    }
}

实现类会把类名打出来,我们现在要写个工厂类负责构造实现类的对象。

public class SimpleFactory1 {
    public ICar createCar(String carName){
        if("audi".equals(carName)){
            return  new Audi();
        } else if ("benz".equals(carName)) {
            return new Benz();
        }

        return null;
    }

    public static void main(String[] args) {
        SimpleFactory1 carFactory = new SimpleFactory1();
        ICar audi = carFactory.createCar("audi");
        audi.getBrand();
        ICar benz = carFactory.createCar("benz");
        benz.getBrand();
    }
}

工厂类采用的是根据传入类型判断创建哪个实体类,这种方式是实现起来很简单,有几种类型就相应的写多个if...else...分支即可。但这种工厂模式让人感觉很低能,因为每次需要增加一种类型的车辆,不仅要加相应的实体类,还要修改工厂类,明显违背了开闭原则。现在提供第二种工厂类:

public class SimpleFactory2 {
    public ICar createCar(Class<? extends  ICar> carClass){
        try {
            return carClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        SimpleFactory2 carFactory = new SimpleFactory2();
        ICar audi = carFactory.createCar(Audi.class);
        audi.getBrand();
        ICar benz = carFactory.createCar(Benz.class);
        benz.getBrand();
    }

第二种工厂类的实现是根据实体类的Class的类型来自动生成实例,这种方式极大了提升了程序的扩展性,后续工厂类不需要做任何更改,只要加让实体类实现ICar接口,那么就能通过工厂类生产出相应的车辆。

现在最热门的Spring框架的IOC就是基于工厂模式,IOC通过DI(依赖注入)的方式将bean的创建交给了Spring Container,Spring Container 自动帮我们创建对象,我们只需要使用即可。

下面将采用Spring提供的一些组件来实现一个简单工厂,首先原有的实体类需要做下改造,类上加了@Component注解:

@Component
public class Audi implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Audi.class.getSimpleName());
    }
}
public class SpringFactory {
    public ICar createCar(String carName){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.discover.amazing.model");
        return (ICar) context.getBean(carName);
    }

    public static void main(String[] args) {
        SpringFactory springFactory = new SpringFactory();
        ICar carBean = springFactory.createCar("audi");
        carBean.getBrand();
    }
}

Spring 这个工厂和前面的两种实现方式有没有本质区别呢,必须有,毕竟Spring 这么强大的世界级框架能被成千上万的企业使用有其道理。前面已经提示了,Spring 框架有Spring 容器,Spring 容器在启动的时候已经创建了,所有被@Component注解标注的实体类都会被扫描到放入容器中,下次使用是直接从容器中取出对象,不会再new新的对象。

可见,理解设计模式非常重要,通过设计模式,我们才能更深入的理解各种框架,理解了框架本质和思想,才能利用框架写出高质量的代码。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架,有多种设计模式被广泛应用。以下是一些常见的设计模式Spring应用示例: 1. 单例模式(Singleton Pattern):Spring容器默认使用单例模式管理Bean。通过配置合适的作用域(scope),可以确保只创建一个Bean实例,并且在整个应用程序共享。 2. 工厂模式(Factory Pattern):SpringIoC容器(例如ApplicationContext)充当了工厂,负责创建和管理Bean实例。通过配置文件或注解,可以指示容器使用适当的工厂方法来创建对象。 3. 依赖注入(Dependency Injection):这是Spring框架最显著的特性之一。它使用了控制反转(IoC)和依赖注入(DI)这两个核心概念,通过将依赖关系委托给容器来实现松散耦合。这使得应用程序更易于测试、维护和扩展。 4. 观察者模式(Observer Pattern):Spring框架提供了事件机制,可以通过观察者模式实现发布-订阅模型。应用程序可以定义事件和监听器,当事件发生时通知相应的监听器。 5. 模板方法模式(Template Method Pattern):Spring的JdbcTemplate类是一个常见的示例。它定义了一组模板方法,供开发人员实现其具体行为。这样,开发人员只需关注核心业务逻辑,而不必担心与数据库交互的细节。 6. 适配器模式(Adapter Pattern):Spring的AOP(面向切面编程)使用了适配器模式,将横切关注点与核心业务逻辑分离。通过创建一个切面(Aspect),可以在不修改原始代码的情况下添加额外的功能,例如事务管理和日志记录。 这只是一些常见的设计模式Spring应用示例,实际上Spring框架还涵盖了许多其他设计模式使用设计模式有助于提高代码的可维护性、可扩展性和重用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值