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

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

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的代码量。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,970评论 1 15
  • “一位母亲陪孩子做作业被气成心梗住院治疗”在最近刷爆的朋友圈,有不少友友对这位母亲抱以同情,当时看了一笑置...
    管婕妈妈阅读 110评论 0 0
  • 门帘外传来雨声潺潺,浓郁的春意又要凋残。罗织的锦被受不住五更时的冷寒。只有迷梦中忘掉自身是羁旅之客,才能享受片时...
    王炳惠阅读 300评论 0 3
  • 以下提供大家能够执行的一周辟谷方式: 准备蜂蜜或红枣以及水果若干。 第一日,杜绝肉类,多食用绿色蔬菜,多饮水,排除...
    每个人的孟母堂阅读 538评论 0 1