工厂模式(Factory Pattern)

概念

工厂模式也称简单工厂模式,是创建型设计模式的一种,这种设计模式提供了按需创建对象的最佳方式。同时,这种创建方式不会对外暴露创建细节,并且会通过一个统一的接口创建所需对象;

简介

作用 及优势

  • 其主要作用就是减少if else,然后对对象的创建进行统一的管理;

  • 扩展性好,需要新增功能的时候,只需要在工厂里面加上类型就行

  • 创建对象只需提供对象类型就行

  • 屏蔽了实现,传入指定值就行,具体逻辑无需调用者关心

不足之处

当需要增加一个功能时,对应的需要再新增一个具体实现类,这样的情况下,当需求膨胀扩张的时候,其子类会大量增加,也会增加代码的维护成本;

场景

  1. spring里面就有BeanFactory,只需要根据bean类型就能拿到对应的Bean;

  2. 根据type拿到对应的支付方式,一般支付方式都有很多重,对应的会将其SDK封装,然后根据type去选择指定的支付方式进行收款;

代码

案例描述

创建一个接口,容器(Column: 抽象产品类),然后有存液体的功能;然后有两个实现类(WaterColumn:具体产品类)、(TeaColumn:具体产品类),再通过工厂类(ColumnFactory:工厂类,这里)去根据不同类型,选择行创建不同功能类,想喝茶就去创建 Tea;大概就是如此!

核心: 程序员是需要多休息的,累了、困了,坐下来喝喝茶,听听小曲;

Suggestion.gif

工程目录

image.png#yyds干货盘点#-设计模式分享-工厂模式

项目类图

简单工厂.png#yyds干货盘点#-设计模式分享-工厂模式

具体实现

顶级接口:Column.java,有存液体的功能;


/**
 * @author chengxing.wu@xiaobao100.com
 * @date 2021/6/15 17:37
 */
public interface Column {
    /**
     * 存放液体
     */
    void storeLiquid();
}

WaterColumn.java实现其功能,并能够装水;


/**
 * @author chengxing.wu@xiaobao100.com
 * @date 2021/6/15 17:39
 */
public class WaterColumn implements Column {
    @Override
    public void storeLiquid() {
        System.out.println("==== 水壶 ====");
    }
}

TeaColumn.java:是给我们喝茶扯淡的类

/**
 * @author chengxing.wu@xiaobao100.com
 * @date 2021/6/15 17:39
 */
public class TeaColumn implements Column {

    @Override
    public void storeLiquid() {
        System.out.println("==== 茶壶 ====");
    }
}

ColumnFactory.java:这玩意就是工厂,我们可以理解为他是个智能饮水机一样,告诉他我们要聊天了,赶紧给我们准备茶,然后哗哗哗的就给们沏茶;

/**
 * @author chengxing.wu@xiaobao100.com
 * @date 2021/6/15 17:41
 */
public class ColumnFactory {

    /**
     * 获取对应的功能类
     *
     * @param type
     * @return
     */
    public static Column create(String type) {
        if ("tee".equals(type)) {
            return new TeaColumn();
        } else if ("water".equals(type)) {
            return new WaterColumn();
        }
        return new TeaColumn();
    }
}

测试

/**
 * @author chengxing.wu@xiaobao100.com
 * @date 2021/6/15 17:41
 */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        /**
         * 通过简单工厂模式可以减少很多代码,其他地方要用的时候,也只需要传入自己想要的功能就行,
         * 不用去关心功能里面具体的实现,这样代码也就能复用了
         */
        Column tee = ColumnFactory.create("tee");
        tee.storeLiquid();
        System.out.println("给我们辛苦的程序员来杯卡布奇洛茶...");
        System.out.println("-----------------");
        Column water = ColumnFactory.create("water");
        water.storeLiquid();
        System.out.println("来杯白开水...");
    }
}

结果

==== 茶壶 ====
给我们辛苦的程序员来杯卡布奇洛茶...
-----------------
==== 水壶 ====
来杯白开水...