工厂模式(Factory Pattern)
概念
工厂模式也称简单工厂模式,是创建型设计模式的一种,这种设计模式提供了按需创建对象的最佳方式。同时,这种创建方式不会对外暴露创建细节,并且会通过一个统一的接口创建所需对象;
简介
作用 及优势
-
其主要作用就是减少if else,然后对对象的创建进行统一的管理;
-
扩展性好,需要新增功能的时候,只需要在工厂里面加上类型就行
-
创建对象只需提供对象类型就行
- 屏蔽了实现,传入指定值就行,具体逻辑无需调用者关心
不足之处
当需要增加一个功能时,对应的需要再新增一个具体实现类,这样的情况下,当需求膨胀扩张的时候,其子类会大量增加,也会增加代码的维护成本;
场景
-
spring里面就有BeanFactory,只需要根据bean类型就能拿到对应的Bean;
- 根据type拿到对应的支付方式,一般支付方式都有很多重,对应的会将其SDK封装,然后根据type去选择指定的支付方式进行收款;
代码
案例描述
创建一个接口,容器(Column: 抽象产品类),然后有存液体的功能;然后有两个实现类(WaterColumn:具体产品类)、(TeaColumn:具体产品类),再通过工厂类(ColumnFactory:工厂类,这里)去根据不同类型,选择行创建不同功能类,想喝茶就去创建 Tea;大概就是如此!
核心: 程序员是需要多休息的,累了、困了,坐下来喝喝茶,听听小曲;
工程目录
项目类图
具体实现
顶级接口: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("来杯白开水...");
}
}
结果 :
==== 茶壶 ====
给我们辛苦的程序员来杯卡布奇洛茶...
-----------------
==== 水壶 ====
来杯白开水...