java 工厂模式的作用,为什么要用工厂模式以及示例演示

1 工厂模式的作用,为什么要用工厂模式?

工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。

工厂模式可以降低代码重复。如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。

工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

 

2.工厂模式的一些适用场景:

 对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等

类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变

 

3.示例演示

下面实现一个加减乘除的工厂方法模式

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

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

package demo8;

/**

 * 工厂接口

 *

 */

interface IFactory {

    Operation CreateOperation();

}

package demo8;

/**

 * 具体工厂(Concrete Creator)角色:加法类工厂

 *

 */

public class AddFactory implements IFactory {

    @Override

    public Operation CreateOperation() {

        return new OperationAdd();

    }  

}

package demo8;

/**

 * 具体工厂(Concrete Creator)角色:减法类工厂

 *

 */

public class SubFactory implements IFactory {

    @Override

    public Operation CreateOperation() {       

        return new OperationSub();

    }

}

package demo8;

/**

 * 具体工厂(Concrete Creator)角色:乘法类工厂

 *

 */

public class MulFactory implements IFactory {

    @Override

    public Operation CreateOperation() {       

        return new OperationMul();

    }

}

package demo8;

/**

 * 具体工厂(Concrete Creator)角色:除法类工厂

 *

 */

public class DivFactory implements IFactory {

    @Override

    public Operation CreateOperation() {       

        return new OperationDiv();

    }

}

package demo8;

/**

 * 抽象产品(Product)角色:运算类

 *

 */

public abstract class Operation {

    private double numberA = 0;

    private double numberB = 0;

    public void setNumberA(double numberA) {

        this.numberA = numberA;

    }

    public void setNumberB(double numberB) {

        this.numberB = numberB;

    }

    public double getNumberA() {

        return numberA;

    }

    public double getNumberB() {

        return numberB;

    }

    public double getResult() {

        double result = 0;

        return result;

    }  

}

package demo8;

/**

 * 具体产品(Concrete Product)角色:加法类

 *

 */

public class OperationAdd extends Operation {  

    @Override

    public double getResult() {

        double result = 0;

        result = super.getNumberA() + super.getNumberB();

        return result;

    }

}

package demo8;

/**

 * 具体产品(Concrete Product)角色:减法类

 *

 */

public class OperationSub extends Operation {  

    @Override

    public double getResult() {

        double result = 0;

        result = super.getNumberA() - super.getNumberB();

        return result;

    }

}

package demo8;

/**

 * 具体产品(Concrete Product)角色:乘法类

 *

 */

public class OperationMul extends Operation {

    @Override

    public double getResult() {

        double result = 0;

        result = super.getNumberA() * super.getNumberB();

        return result;

    }

}

package demo8;

/**

 * 具体产品(Concrete Product)角色:除法类

 *

 */

public class OperationDiv extends Operation {

    @Override

    public double getResult() {

        double result = 0;

        if (super.getNumberB() == 0)           

            throw new ArithmeticException("除数不能为0.");          

        result = super.getNumberA() / super.getNumberB();

        return result;

    }

}

package demo8;

/**

 * 客户端

 *

 */

public class Demo8 {

    public static void main(String[] args) {

        IFactory operFactory = new AddFactory();       

        Operation oper = operFactory.CreateOperation();

        oper.setNumberA(10);

        oper.setNumberB(7);

        double result = oper.getResult();

        System.out.println(result);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值