「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
1.定义
属于创建型模式,有一个专门的类,用来创建其他类的实例,这些类的实例都有相同的父类,当传入一个指定的参数时会返回对应的实例。
2.模式结构
简单工厂模式包含三个角色:
- Factory:工厂角色
- Product:抽象产品角色
- ConcreteProduct:具体产品角色
3.时序图
4.代码分析
代码案例:有一个电脑工厂,有笔记本电脑生产线和台式电脑生产线,订单淡季需要按照订单量来开启指定的生产线,假设传参=1时开启台式电脑生产线,传参=2时开启笔记本电脑生产线,代码如下
/**
* 工厂角色
*/
public static class ComputerFactory {
//1:台式电脑 2:笔记本电脑
public Computer returnComputer(int type) {
if (type == 1) {
return new DesktopComputer();
} else if (type == 2) {
return new LaptopComputer();
} else {
return null;
}
}
}
/**
* 抽象产品角色
*/
public static abstract class Computer {
/**
* 组装的电脑(台式、笔记本)
*/
public abstract void buildComputer();
}
/**
* 具体产品角色——台式电脑
*/
public static class DesktopComputer extends Computer {
@Override
public void buildComputer() {
System.out.println("台式电脑组装完成");
}
}
/**
* 具体产品角色——笔记本电脑
*/
public static class LaptopComputer extends Computer {
@Override
public void buildComputer() {
System.out.println("笔记本电脑组装完成");
}
}
/**
* 具体使用
*/
public static void main(String[] args) {
ComputerFactory factory = new ComputerFactory();
factory.returnComputer(1).buildComputer();
factory.returnComputer(2).buildComputer();
}
返回结果分别是:
台式电脑组装完成
笔记本电脑组装完成
5.模式分析
- 将对象创建和对象本身的处理逻辑进行分离,使系统解耦,进而使得两者在修改时都较为方便;
- 简单工厂模式最大的特点就是,当我需要一个类时主需要传入一个参数就可以获取到我想要的类,不用关心它是怎么创建的;
- 简单工厂模式有一个弊端,当我需要增加一个新的类时就要修改工厂类中的判断代码,但是这样就违背了开闭原则。
6.优点
- 简单工厂模式有一个工厂类负责在指定参数下创建具体的类,这样客户端主需要负责消费产品即可,这样做的好处是实现了责任的分割;
- 客户端在使用时只需要传入参数即可,不用知道将要使用的是哪个类;
7.缺点
- 由于工厂类中集成了所有具体产品类,因此如果工厂类出现问题则整个系统将无法使用;
- 如果要增加一个新的具体产品,那么就需要修改工厂类的判断逻辑,这样违背了开闭原则;
- 工厂类中集成了所有具体产品类,这会导致工厂类逐渐变得复杂起来。
8.适用环境
- 工厂类中需要创建的实例较少,这样系统不至于变得太复杂
- 客户端不用记住具体产品类的名字也不用关心创建细节,只需要传递参数即可。
参考链接:简单工厂模式