设计模式——工厂模式JAVA

工厂模式

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。客户只需要从工厂中获取到所需要的实例对象即可,不再需要进行new操作。其实Spring中的IOC容器就可以看做是一个巨大的工厂类。

简单工厂模式

简单工厂模式(Simple Factory Pattern),是决定一个工厂类来决定创建一类特定的对象实例,不是GOF的23种设计模式。
在这种模式中,客户端只需要明确需要哪种对象实例即可,具体的创建过程这是交给了工厂类,客户端不需要关系内部的实现过程,对客户而言,调用更加简单,服务也可以有较好的扩展性。

简单示例

类图

在这里插入图片描述有一份学习作业,但是他的种类很多,举出java作业和python作业为例,两个实现类,具有不同的doHomework()方法。

测试类

在这里插入图片描述这样一来对于类似

private static void doHomework(IHomework homework){
        homework.doHomework();
    }

的方法可以不用修改就能完成功能的扩展。但是这种方式中,客户端直接依赖于工厂接口的实现类,虽说可以扩展,但是如果扩展量较大,则客户端的代码就会显得十分的臃肿,就目前而言,对象的创建不是很复杂,仅仅使用一个new的步骤即可,但是以后随着业务的扩展,相应的创建过程就会越来越复杂,这样一来,这种方式就不适合了。可以做相应的优化;
在这里插入图片描述在这里插入图片描述
这样通过反射的方式,将具体的对象的创建过程封装起来,客户端直接和createHomework类交互即可,在后续的扩展时也不需要对该类修改,可控性也得到提高。

缺点

工厂类的职责过于繁重,不易于扩展复杂的结构。

工厂方法模式

工厂方法模式,指的是定义一个创建对象的接口,但是让这个接口的实现类来具体的决定创建什么对象。客户端只需要关心对象对应的工厂,无须关心创建细节。
工厂方法模式,解决的就是扩展的问题,对于简单的工厂模式而言,如果所需要的对象种类繁多,就会出现工厂的职责不断的扩充,不符合单一职责原则,而且也不便于进行高效的维护,各个实现类之间的关系复杂不好分,对客户端的调用也产生了一定代价。对于这个问题,我们可以建立分工厂,针对某一特定或一类的对象建立特定的工厂,具体的创建由对应的分工厂实现。

public class JavaFactory implements ICourseFactory {
    @Override
    public ICourse createCourse() {
        return  new JavaCourse();
    }
}
public class PythonFactory implements ICourseFactory {
    @Override
    public ICourse createCourse() {
        return new PythonCourse();
    }
}
public interface ICourseFactory {
    /**
     *功能描述:创建课程实例对象,工厂方法模式
     */
    ICourse createCourse();
}

在这里插入图片描述

适用场景

  1. 在创建一个对象时,需要大量的逻辑和数据的封装操作
  2. 客户端对对象的创建不关心
  3. 父类由其子类来创建对象

抽象工厂模式

这种模式提供一个创建一系列相关 的或者依赖的接口,不指定特定的具体类。一个对应的工厂可以创建相互联系的对象或者业务,这一系列的对象都被一个工厂封装,既能够进行扩展,又方便管理。

类图

在这里插入图片描述
简单来说,就是对于一类特定的对象可以通过特定的工厂创建,IFactory接口是对工厂的抽象。

猜你喜欢

转载自blog.csdn.net/qq_45744501/article/details/105481705