Factory Methodパターン
状況によって生成されるオブジェクトを変更したいケースで使う。
メリット
-
- オブジェクトの生成に必要な手続きを利用側から隠蔽できる
- サブクラスを返すことで利用側は型制約から解放される
実装例
- Factory PenとKnifeをつくる
package Factory; use Product::Pen; use Product::Knife; sub create { my $type = shift; my $product; if ($type eq 'pen') { $product = new Product::Pen(); $product->id(123); } elsif ($type eq 'knife') { $product = new Product::Knife(); $product->id(456); } return $product; } 1;
- Product スーパークラス
package Product; use strict; sub new { my $class = shift; return bless {}, $class; } sub id { my ($self, $id) = @_; if ($id) { $self->{id} = $id; } return $self->{id}; } sub how_to_use { return ''; } 1;
- Product::Pen 具象クラス
package Product::Pen; use strict; use base qw(Product); sub how_to_use { return 'for writing or drawing.'; } 1;
- Main 呼び出し側
use Factory; my $pen = Factory::create('pen'); my $knife = Factory::create('knife'); print $pen->id(), "\n"; # 123 print $knife->id(), "\n"; # 456 print $pen->how_to_use(), "\n"; # for writing or drawing. print $knife->how_to_use(), "\n"; # for cutting.
まとめ
Factory Methodパターンを使うと、呼び出し側でオブジェクト生成の諸々の処理を隠蔽できる。
また、スーパークラスを返せば型制約から解放し、再利用性を高めることができる。