3
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?

More than 5 years have passed since last update.

PerlでBuilderパターンを書いてみた。

Last updated at Posted at 2018-03-29
1 / 9

概要

PerlでBuilderパターンを書いてみました。


Builderパターンとは

  • オブジェクト
  • 必須パラメータ
  • optionalパラメータ

を渡すといい感じに動的にオブジェクトを作ってくれる。


wiki

Builder パターン(ビルダー・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。


Effective Java

コンストラクタの引数には, Builder オブジェクトを渡す。
Builder オブジェクトの引数には必須の情報を渡す。
任意の引数には, setter を用意する。

Dinner dinner  = new Dinner ("焼肉").setDrink("ビール").setDessert("アイス").build();


Perlで実装

DinnerBuilder.pm
package DinnerBuilder;
use strict;
use warnings;
use utf8;

use Mouse;

has food => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has drink => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has dessert => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has price => (
    is      => 'rw',
    isa     => 'Int',
    default => 0,
);

sub create {
    my ($class, $food) = @_;

    return $class->new(
        food    => $food,
        drink   => 'none',
        dessert => 'none',
        price   => 1000,
    );
}

sub set_drink {
    my ($self, $drink) = @_;
    $self->drink = $drink;

    $self->price += 100;
    return $self;
}

sub set_dessert {
    my ($self, $dessert) = @_;
    $self->dessert = $dessert;

    $self->price += 500;
    return $self;
}

sub build {
    my $self = shift;
    return $self;
}

sub payment {
    my $self = shift;
    return join(',', ($self->food, $self->drink, $self->dessert, $self->price));
}

no Moose;
__PACKAGE__->meta->make_immutable;

Dinner.pl
use strict;
use warnings;
use utf8;

use feature qw/say/;
use DinnerBuilder;

my $pay1 = DinnerBuilder
    ->create('Sushi')
    ->set_drink('Beer')
    ->set_dessert('Icecream')
    ->build()
    ->payment();

say $pay1;

my $pay2 = DinnerBuilder
    ->create('Sushi')
    ->build()
    ->payment();

say $pay2;

結果

$ perl Dinner.pl
Sushi,Beer,Icecream,1600
Sushi,none,none,1000

かっこよくて良いなと思いました。


3
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
3
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?