之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。
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
|
# -*- encoding: utf-8 -*-
#运算类
class Operation
attr_accessor :number_a , :number_b
def initialize(number_a = nil , number_b = nil )
@number_a = number_a
@number_b = number_b
end
def result
0
end
end
#加法类
class OperationAdd < Operation
def result
number_a + number_b
end
end
#减法类
class OperationSub < Operation
def result
number_a - number_b
end
end
#乘法类
class OperationMul < Operation
def result
number_a * number_b
end
end
#除法类
class OperationDiv < Operation
def result
raise '除数不能为0' if number_b == 0
number_a / number_b
end
end
#工厂类
class OperationFactory
def self .create_operate(operate)
case operate
when '+'
OperationAdd. new ()
when '-'
OperationSub. new ()
when '*'
OperationMul. new ()
when '/'
OperationDiv. new ()
end
end
end
oper = OperationFactory.create_operate( '/' )
oper.number_a = 1
oper.number_b = 2
p oper.result
|
这样写的好处是降低耦合。
比如增加一个开根号运算的时候,只需要在工厂类中添加一个分支,并新建一个开根号类,不会去动到其他的类。
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
|
# -*- encoding: utf-8 -*-
#运算类
class Operation
attr_accessor :number_a , :number_b
def initialize(number_a = nil , number_b = nil )
@number_a = number_a
@number_b = number_b
end
def result
0
end
end
#加法类
class OperationAdd < Operation
def result
number_a + number_b
end
end
#减法类
class OperationSub < Operation
def result
number_a - number_b
end
end
#乘法类
class OperationMul < Operation
def result
number_a * number_b
end
end
#除法类
class OperationDiv < Operation
def result
raise '除数不能为0' if number_b == 0
number_a / number_b
end
end
module FactoryModule
def create_operation
end
end
#加法工厂
class AddFactory
include FactoryModule
def create_operation
OperationAdd. new
end
end
#减法工厂
class SubFactory
include FactoryModule
def create_operation
OperationSub. new
end
end
#乘法工厂
class MulFactory
include FactoryModule
def create_operation
OperationMul. new
end
end
#除法工厂
class DivFactory
include FactoryModule
def create_operation
OperationDiv. new
end
end
factory = AddFactory. new
oper = factory.create_operation
oper.number_a = 1
oper.number_b = 2
p oper.result
|
相比于简单工厂模式,这里的变化是移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。