4.3 简单工厂模式

序言

假设现在有一家生产汽车的工厂,可以生产宝马、奔驰和奥迪等多种车型。只需你告诉工厂的制造人,你需要的车型,工厂就可以给你加工对应的车型。此需求相当与给工厂一个输入,可以获得对应的输出对象,此时就可以使用简单工厂模式。

定义

简单工厂模式(也被称为静态工厂方法模式),属于创建型。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

类图

图片说明

简单工厂包含了:

  • 抽象产品(IProduct)
  • 具体产品(ConcreteProduct):最终工厂创建出的实例对象(产品)
  • 生成产品的工厂(Factory):用于根据不同条件创建不同的实例(产品)

示例代码

第一步:定义抽象产品:ICar

public interface ICar {
    void introduce();
}

第二步:定义具体产品(此处分别创建了奔驰车、奥迪车和宝马车)

public class AudiCar implements ICar {
    @Override
    public void introduce() {
        System.out.println("我是奥迪");
    }
}

public class BenzCar implements ICar {
    @Override
    public void introduce() {
        System.out.println("我是奔驰");
    }
}

public class BMWCar implements ICar {
    @Override
    public void introduce() {
        System.out.println("我是宝马");
    }
}

第三步:创建生产汽车的静态工厂(注意build方法是静态的)

public class CarFactory {
    public static ICar buildCar(String car) {
        if ("bmw".equalsIgnoreCase(car)) {
            return new BMWCar();
        } else if ("benz".equalsIgnoreCase(car)) {
            return new BenzCar();
        } else if ("audi".equalsIgnoreCase(car)) {
            return new AudiCar();
        } else {
            return null;
        }
    }
}

第四步:给工厂传入参数生产汽车

public class Client {
    public static void main(String[] args) {
        // 此处可以输入bmw/audi/benz尝试一下
        ICar car = CarFactory.buildCar("audi");
        if (car != null) {
            car.introduce();            // 输出“我是奥迪”
        }
    }
}

考点1:JDK中有哪些地方使用到了简单工厂模式?

优缺点

优点

  1. 将创建哪种产品的逻辑放在工厂类里面,减去调用方直接创建的麻烦,只要直接使用产品即可
  2. 调用方无需感知具体创建的对象,只需理解需要创建对象的参数即可。如果将这个参数配置成配置文件,当需要调整创建对象的时候,只需改动配置文件,无需调用方进行修改

缺点

  1. 所有创建逻辑集中在工厂,造成了单点问题。如果工厂出现问题,所有的创建均不可用
  2. 系统扩展较麻烦,所有逻辑集中在工厂,如果新增产品类,则会导致工厂类的代码增加,不利于维护
全部评论

相关推荐

小浪_Coding:个人技能一条测试没有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务