JS开发之Factory(工厂)模式解析

JS开发之Factory(工厂)模式解析,Factory模式时另一种创建型模式,涉及创建对象的概念。其分类不同于其他模式的地方在于它不显式地要求使用一个构造函数。而Factory可以提供一个通用的接口来创建对象,我们可以指定我们所希望创建的工厂对象的类型。

模式图:

JS开发之Factory(工厂)模式解析

如果对象创建过程相对比较复杂,这种方法特别有用,例如,如果它强烈依赖于动态因素或应用程序配置的话。

示例:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document</title>

</head>

<body>

    <script>

        //先定义几种车 构造函数  工厂方法

        function Car(options) {

            this.doors = options.doors || 4;

            this.state = options.state || "brand";

            this.color = options.color || "silver";

        }

        function Truck(options) {

            this.state = options.state || "used";

            this.wheelSize = options.wheelSize || "large";

            this.color = options.color || "blue";

        }

  

        //再定义生产车辆的工厂

        function VehicleFactory() {}

        //定义该工厂生产的默认汽车类型

        VehicleFactory.prototype.vehicleClass = Car; //Car是函数

        //定义生产汽车的具体过程

        VehicleFactory.prototype.createVehicle = function(options) {

            if(options.vehicleType === "car"){

                this.vehicleClass = Car;

            }else{

                this.vehicleClass = Truck;

            }

  

            return new this.vehicleClass(options);

        };

  

        //建造工厂并命名

        var carFactory = new VehicleFactory();

        //开始生产汽车

        var car = carFactory.createVehicle({

            vehicleType: "car",

            color: "yellow",

            doors: 6

        });

        //验证车是否是这个Car类型的车

        console.log(car instanceof Car);

        //验验车,看看货

        console.log(car);

  

        //再生产另一部车

        var movingTruck = carFactory.createVehicle({

            vehicleType: "truck",

            state: "like new",

            color: "red",

            wheelSize: "small"

        });

        //验证车是否是Track类型的车

        console.log(movingTruck instanceof Truck);

        //验验车,看看货

        console.log(movingTruck);

  

        //-----------------------------------------------

        //定义第二个工厂  是上面那个工厂的子工厂

        function TruckFactory() {}

        TruckFactory.prototype = new VehicleFactory();

        TruckFactory.prototype.vehicleClass = Truck;

        //创建工厂

        var TruckFactory = new TruckFactory();

        //生产卡车

        var myBigTruck = TruckFactory.createVehicle({

            state: "omg..so bad.",

            color: "pink",

            wheelSize: "so big"

        });

        //验验车

        console.log(myBigTruck instanceof Truck);

        //看看货

        console.log(myBigTruck);

    </script>

</body>

</html>


何时使用Factory模式
Factory模式应用于如下场景时是特别有用的:
(1)当对象或组件涉及高复杂性时
(2)当需要根据所在的不同环境轻松生成对象的不同实例时
(3)当处理很多共享相同属性的小型对象或组件时
(4)在编写只需要满足一个API契约(亦称鸭子类型)的其他对象的实例对象时,对于解耦是很有用的。
何时不应使用Factory模式
如果应用错误,这种模式会为应用程序带来大量不必要的复杂性。除非为创建对象提供一个接口是我们正在编写的库或框架的设计目标,否则建议坚持使用显式构造函数,以避免不必要的开销。
由于对象创建的过程实际上藏身接口之后抽象出来的,单元测试也可能带来问题,这取决于对象创建的过程有多复杂。