【设计模式】工厂模式

发布时间 2023-12-12 22:38:00作者: 此木|西贝
通过工厂模式,我们可以将对象的创建封装起来,达到提高重用和与业务代码解耦的目的。

工厂模式分为三类

  • 简单工厂
  • 工厂模式
  • 抽象工厂

简单工厂

定义

简单工厂:不算是一个真正的设计模式,却是一个常用的,将对象的创建和业务代码解耦的方案。

适用场景

在程序运行过程中,根据传递的参数获取某个接口/抽象类的具体实现。适用于不是很复杂的对象的创建。
一般是提供静态方法,根据参数的不同返回不同的实例。

工厂代码

public class SimpleFactory {
    
    public static Object createBean(String type){
        if (Objects.equals("string",type)){
            return new String();
        }else if (Objects.equals("int",type)){
            return new Integer(0);
        } else if (Objects.equals("bigdecimal",type)) {
            return BigDecimal.ONE;
        }else {
            return new Object();
        }
    }
}

类图

image

工厂模式

定义

工厂模式:定义了一个创建对象的接口,由子类(子工厂)决定提供哪些类的实例。工厂方法让类把实例化推迟到子类。

适用场景

一般是提供工厂接口,然后根据不同场景获取具体的工厂实例,再进行对象实例的获取。

工厂代码

public interface Factory {
    
    Object createBean(String type);
    
}

class FactoryA implements Factory{
    @Override
    public Object createBean(String type) {
        if (Objects.equals("string",type)){
            return new String();
        }else if (Objects.equals("int",type)){
            return new Integer(0);
        } else if (Objects.equals("bigdecimal",type)) {
            return BigDecimal.ONE;
        }else {
            return new Object();
        }
    }
}

类图

image

抽象工厂

定义

抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要指明具体的类。

使用场景

跟工厂模式一样提供工厂接口,但是工厂中不再是单一类的实例,而是与之相关的一系列类的实例
例如:访问数据库时,根据底层数据库的不同获取到的工厂也不同,返回的数据库连接、数据集等也不尽相同。

工厂代码

public interface AbstractFactory {

    Object createBean();

    DataSource createDataSource();

    Connection createConnection();
    
    
}

interface DataSource{}
interface Connection{}


class FactoryA implements AbstractFactory{

    @Override
    public Object createBean() {
        return null;
    }

    @Override
    public DataSource createDataSource() {
        return null;
    }

    @Override
    public Connection createConnection() {
        return null;
    }
}

类图

image