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;
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パターンを使うと、呼び出し側でオブジェクト生成の諸々の処理を隠蔽できる。
また、スーパークラスを返せば型制約から解放し、再利用性を高めることができる。