专栏首页bingfeng-技术设计模式之 - 简单工厂模式

设计模式之 - 简单工厂模式

阅读本文大概需要6分钟

一、什么是简单工厂模式

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,一个抽象的产品类,可以派生出多个具体的产品类,它们都具有共同的父类。

我们再来看下简单工厂模式的UML图:

二、简单工厂模式的构成

  • 工厂类:工厂类是我们的核心类,它负责创建所有实例的内部逻辑,工厂类可以直接被调用创建我们的产品实例。
  • 抽象产品类:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所拥有的公共接口。
  • 具体产品类:简单工厂所创建的具体的实例对象。

三、实例演示

我们做这个一个分析,有一家造车厂它里面可以造车的各个零件,在这个厂里,有专门造轮胎的车间,有专门造发动机的车间还有换门造车玻璃的车间,那么我们想一下,这些车间是不是都是归属于这个造车厂的,每个车间是不是都有自己的职能。

假设我们现在组装车间要组装一辆车,他们需要发动机、轮胎、玻璃等部件,那么作为组装车的人,他们根本不关心你怎么做,他们只关心这个东西做没做好,做好了赶紧递过来,我这边要用。

我们先来创建一个造车厂的类:

public interface CarFactory {

    void ability();
}

我们既然有了造车厂,那么我们地下的车间部门只需要实现这个类,去完成各自的职能就可以了

玻璃车间:

public class Glass implements CarFactory{

    @Override
    public void ability() {

        System.out.println("玻璃已经生产好了");
    }
}

发动机车间:

public class Engine implements CarFactory {

    @Override
    public void ability() {

        System.out.println("发动机制造好了");
    }
}

轮胎车间:

public class AutoTyre implements CarFactory{

    @Override
    public void ability() {

        System.out.println("轮胎已经生产好了");
    }
}

既然已经有个产品类和具体的产品,那么接下来我们是不是要做一个工厂去进行生产啊,工厂类是整个模式的关键,它需要进行必要的逻辑判断,根据消费者给的信息,它需要决定来创建哪个对象的实例,消费者不再关心如何创建具体的产品,他只需要负责好需要生产的产品就行了。

public class Product {

    public static CarFactory product(String skill) {

        CarFactory carFactory = null;

        switch (skill) {
            // 制造轮胎
            case "autoTyre":
                carFactory = new AutoTyre();
                break;
            // 制造发动机
            case "engine":
                carFactory = new Engine();
                break;
            // 制造玻璃
            case "glass":
                carFactory = new Glass();
        }

        return carFactory;
    }
}

在这里我们可以发现,所有类都有一个共同的父类,到这里大家应该可以发现,我们平时所说的封装、继承、多态在这里是不是已经体现出来了(这里面我没用继承,是因为Java是单继承的,所以我这里改为了接口实现的方式,因为Java是可以多实现的,这样有利于我们程序的扩展)。

接下里,我们来看下组装车间是怎么来索要所需的部件的

public class CarMain {

    public static void main(String[] args) {

        // 生产一个发动机
        CarFactory engine = Product.product("engine");
        engine.ability();

        // 生产一个玻璃
        CarFactory glass = Product.product("glass");
        glass.ability();

        // 生产一个轮胎
        CarFactory autoTyre = Product.product("autoTyre");
        autoTyre.ability();
    }
}

我们先来看下结果:

如果我们想要再去生产其他的一些部件,我们只需要去实现造车厂的类,完成自己特定的职能就可以了,也不会去跟其他的车间有任何的交集,我们只需要完成我们的需要做的东西就好。

四、模式优点

  • 首先程序实现了解耦和,大大降低的程序之间的耦合性,我们增加车间不会影响到其他的车间进度;
  • 提高了程序的扩展性,如果我们想要增加一个车间,那么只需要实现造车厂类,完成自己的职能就好;
  • 组装车间可以免除直接创建对象的责任,他不需要自己直接去创建,而是通过我们专门的工厂类来创建,他只需要告诉我们他需要什么东西;

五、简单工厂模式的缺点

  • 首先大家应该可以明显的发现,如果我们每增加一个产品,那相应的我们就要增加一个子工厂,这样额外的加大了我们的开发量;
  • 由于工厂类集中了所有实例的创建逻辑,违反了高类聚责任分配原则;

六、使用场景

  • 工厂类创建的对象比较少;
  • 消费者只需要传进工厂类的参数,对于如何创建对象不关心;

本文分享自微信公众号 - 一个程序员的成长(xiaozaibuluo),作者:一个程序员的成长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式之-代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。简单来说这就是给目标对象生成一个代理对象,并由代理对象控制对目标对象的引用。

    一个程序员的成长
  • SpringBoot中的异常处理和参数校验

    兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容。

    一个程序员的成长
  • 设计模式之 - 装饰者模式

    装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。

    一个程序员的成长
  • 浅谈JAVA设计模式之——桥接模式(Bridge)

    1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

    冰河
  • springCloud学习5(Spring-Cloud-Stream事件驱动)

      想想平常生活中做饭的场景,在用电饭锅做饭的同时,我们可以洗菜、切菜,等待电饭锅发出饭做好的提示我们回去拔下电饭锅电源(或者什么也不知让它处于保温状态),反正...

    用户2038589
  • springCloud学习5(Spring-Cloud-Stream事件驱动)

      想想平常生活中做饭的场景,在用电饭锅做饭的同时,我们可以洗菜、切菜,等待电饭锅发出饭做好的提示我们回去拔下电饭锅电源(或者什么也不知让它处于保温状态),反正...

    用户2038589
  • Core + Vue 后台管理基础框架3——后端授权

      但凡业务系统,授权是绕不开的一环。见过太多只在前端做菜单及按钮显隐控制,但后端裸奔的,觉着前端看不到,系统就安全,掩耳盗铃也好,自欺欺人也罢,这里不做评论。...

    guokun
  • 责任链模式以及在 Android 中的应用

    这几天在重新阅读 Okhttp 源码的时候,看到了 Okhttp Interceptor 的应用,想起了责任链模式,于是,动手将自己对责任链模式的理解记录了下来...

    用户2965908
  • SpringBoot整合Quartz定时任务 的简单实例

    POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> <groupId...

    庞小明
  • 手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!

    首先我们需要创建一个过滤器,用于实现动态权限控制,这里需要注意的是doFilter方法,对于OPTIONS请求直接放行,否则前端调用会出现跨域问题。对于配置在I...

    macrozheng

扫码关注云+社区

领取腾讯云代金券