美文网首页Java8与函数式编程程序员
函数式编程下的简单工厂模式

函数式编程下的简单工厂模式

作者: 小七赛文 | 来源:发表于2018-03-20 10:23 被阅读56次

工厂模式是我们比较常用的一种模式,工厂模式也有很多变形,其中,最简单是是简单工程模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
下面,我们举一个简单工厂模式的例子。
公司的员工有很多种类型,典型的如“普通员工”、“经理”和“老板”,做这样的区别是这些员工有很多不同,比如,发工资多少的不同。
下面,我们来模拟发工资的情况。
首先是员工类型:

public enum EmployeeType {
    STAFF,
    MANAGER,
    BOSS
}

然后,我们要定义一个抽象的员工接口:

public interface Employee {
    public float salary();
}

接着,是普通员工、经理和老板的具体实现:

public class Staff implements Employee {
    @Override
    public float salary() {
        return 1000;
    }
}

public class Manager implements Employee {
    @Override
    public float salary() {
        return 10000;
    }
}

public class Boss implements Employee {
    @Override
    public float salary() {
        return 1000000;
    }
}

最后,我们就可以实现简单工厂模式了:

public class SimpleFactory {
    public static Employee create(EmployeeType type)
    {
        Map<EmployeeType,Employee> map = new HashMap<>();
    
        map.put(EmployeeType.STAFF, new Staff());
        map.put(EmployeeType.MANAGER, new Manager());
        map.put(EmployeeType.BOSS, new Boss());
    
        return map.get(type);
    }
}

简单工厂模式这样使用:

Employee boss = EmployeeFactory.getEmployee(EmployeeType.BOSS);
System.out.println(boss.salary());

这就完成一个简单工厂模式的实现,整个实现过程目标明确,实现起来也十分简单。
其类图如下所示:


简单工厂模式类图简单工厂模式类图

从类图上可以看出,简单工厂模式使得客户端只依赖接口和工厂,不依赖各具体类的实现,如 Staff 、Manager 、 Boss等等。
这使得客户端在使用类、初始化类都很简单,这就是简单工厂模式的好处。
但是,使用面向对象语言实现简单工厂模式的不好的地方仍然是类的繁多和代码的冗余。我们需要实现三个实体类,每个类里也存在着框架代码和冗余代码。
下面,我们来看看如何使用函数式编程来实现简单工厂模式。
首先,员工类型不变,在这里就不再给出。
再来看看Employee,这里已经不是接口了,因为不需要接口:

public class Employee {
    private Supplier<Float> supplier;
    public Employee(Supplier<Float> supplier) {
        this.supplier = supplier;
    }
    public float salary()
    {
        return supplier.get();
    }
}

可以看到,由于函数式编程中,函数可以作为参数传递,所以我们只需要实现一个Employee类,然后实时的把salary方法的代码传递给对象就可以了。
我们最后来看看工厂类的实现:

public class SimpleEmployeeFactory {
    private static final Map<EmployeeType, Employee> FACTORY = new HashMap<>();
    public static Employee getEmployee(EmployeeType type)
    {
        FACTORY.put(STAFF, new Employee(() -> new Float(1000)));
        FACTORY.put(MANAGER, new Employee(() -> new Float(10000)));
        FACTORY.put(BOSS, new Employee(() -> new Float(1000000)));
        return FACTORY.get(type);
    }

可以看到,使用了函数式编程的简单工厂模式实现起来就简单多了,也没有那么多的冗余代码。
应该把函数式编程大量应用到Java8及以上版本,用来减少Java的代码量。

相关文章

  • 函数式编程下的简单工厂模式

    工厂模式是我们比较常用的一种模式,工厂模式也有很多变形,其中,最简单是是简单工程模式。这种类型的设计模式属于创建型...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • JS对象的几种创建方式

    1)Object构造函数式 2)对象字面量式 3)工厂模式 4)安全工厂模式 5)构造函数模式 6)原型模式 7)...

  • 从零学习Swift 16: 函数式编程

    Swift语言是支持函数式编程的,所以我们需要简单了解一下函数式编程的概念. 在了解函数式编程的概念之前呢,先看看...

  • 设计模式——工厂模式

    工厂模式类型 1、简单工厂模式2、工厂方法模式3、抽象工厂模式 面向接口编程 面向接口编程1、每个模块负责自己的职...

  • 简单点,理解iOS与函数式编程

    简单点,理解iOS与函数式编程 简单点,理解iOS与函数式编程

  • JavaScript中的函数式编程

    JS 函数式编程指南 什么是函数式编程 简单说,"函数式编程"是一种"编程模型"(programming para...

  • 在下函数式编程有何贵干

    本文简单介绍了一下函数式编程的各种基本特性,希望能够对于准备使用函数式编程的人起到一定入门作用。 函数式编程,一个...

  • 创建对象的几种方式

    字面量式(最常用) 调用系统的Object构造函数,创建实例对象 工厂模式 构造函数模式 与工厂模式的区别: 没有...

  • 函数式编程

    函数式编程:Functional Programming 1 基本解释: 函数式编程 是一种思维模式,一种编程思想...

网友评论

    本文标题:函数式编程下的简单工厂模式

    本文链接:https://www.haomeiwen.com/subject/chevqftx.html