4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事は何

デザインパターンについて、Rubyでどのような使い方ができるかをまとめた記事です。
デザインパターン自体の解説は詳しく行いません。

TemplateMethodパターンとは

TemplateMethodパターンとは、スーパークラスで処理の枠組みを定め、その一部をサブクラスで具体的に実装するデザインパターンです。

詳しくはこちらをご覧ください。

Rubyでのコード例

スーパークラスで手続きの流れを実装し、サブクラスで手続きの処理で呼び出しているメソッドの定義を行なっていきます。

class SuperClass
  def template_method
    method1
    method2
    method3
  end

  private

  def method1
    fail NotImplementedError
  end

  def method2
    fail NotImplementedError
  end

  def method3
    fail NotImplementedError
  end
  
end

class SubClass < SuperClass
  private
  
  def method1
    puts 'sub class method1'
  end

  def method2
    puts 'sub class method2'
  end

  def method3
    puts 'sub class method3'
  end
end

SubClass.new.template_method
出力結果
sub class method1
sub class method2
sub class method3

どのような時に使えるか

処理の流れを共通化し、処理の内容をカスタマイズ可能な形を実現したい場合などに有効です。
例えば以下のようなコードはTemplateMethodパターンを用いることで再利用性の高いコードにすることができます。

# レポートの生成プロセスを定義するスーパークラス
class ReportGenerator
  def generate_report
    gather_data
    format_report
    print_report
  end

  private

  def gather_data
    fail NotImplementedError
  end

  def format_report
    fail NotImplementedError
  end

  def print_report
    fail NotImplementedError
  end
end

# 特定のデータを収集し、レポートをフォーマットするサブクラス
class SalesReportGenerator < ReportGenerator
  private

  def gather_data
    puts 'Gathering sales data...'
    @data = 'Sales Data'
  end

  def format_report
    puts 'Formatting sales report...'
    @formatted_report = "Formatted: #{@data}"
  end

  def print_report
    puts 'Printing sales report...'
    puts @formatted_report
  end
end

class InventoryReportGenerator < ReportGenerator
  private

  def gather_data
    puts 'Gathering inventory data...'
    @data = 'Inventory Data'
  end

  def format_report
    puts 'Formatting inventory report...'
    @formatted_report = "Formatted: #{@data}"
  end

  def print_report
    puts 'Printing inventory report...'
    puts @formatted_report
  end
end

# サブクラスを利用してレポートを生成
SalesReportGenerator.new.generate_report
InventoryReportGenerator.new.generate_report
出力結果
Gathering sales data...
Formatting sales report...
Printing sales report...
Formatted: Sales Data
Gathering inventory data...
Formatting inventory report...
Printing inventory report...
Formatted: Inventory Data
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?