-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfactory_pattern.rb
61 lines (51 loc) · 1.58 KB
/
factory_pattern.rb
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
=begin
порождающий шаблон проектирования, предоставляющий подклассам интерфейс
для создания экземпляров некоторого класса. В момент создания наследники
могут определить, какой класс создавать. [...] Это позволяет использовать
в коде программы не специфические классы, а манипулировать абстрактными
объектами на более высоком уровне.
=end
class CsvFormatter
def format(data)
return '' if data.empty?
result = data.keys.join(',') + "\n"
result += data.values.join(',') + "\n"
end
end
class JsonFormater
require 'json'
def format(data)
return '' if data.empty?
data.to_json
end
end
class TsvFormatter
def format(data)
return '' if data.empty?
result = data.keys.join("\t") + "\n"
result += data.values.join("\t") + "\n"
end
end
class Formatter
def self.for(type)
case type
when 'csv'
CsvFormatter.new
when 'json'
JsonFormater.new
when 'tsv'
TsvFormatter.new
else
raise 'Unsupported tupe of report'
end
end
end
class ReportGenerator
def self.generate(data, type)
Formatter.for(type).format(data)
end
end
report_data = { foo_key: 'foo', bar_key: 'bar', baz_key: 'baz' }
puts ReportGenerator.generate(report_data, 'json')
puts ReportGenerator.generate(report_data, 'csv')
puts ReportGenerator.generate(report_data, 'tsv')