初探设计模式——简单工厂模式

195 阅读3分钟

「这是我参与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.适用环境

  • 工厂类中需要创建的实例较少,这样系统不至于变得太复杂
  • 客户端不用记住具体产品类的名字也不用关心创建细节,只需要传递参数即可。

参考链接:简单工厂模式