24 / 06 / 2009

factory method design pattern – php

ekleyen: Emre Çevik kategori: design patterns| php

Merhaba size bu yazıda, factory ( fabrika ) method design pattern hakkında bilgi vermeye çalışacağım.

Bir fabrika tasarım şablonu, kendisine gönderilen parametrelere göre var olan sınıflardan istediğimizi oluşturur ve bize döndürür. Genellikle geriye döndürülen tüm sınıflar ortak bir ebeveyn sınıfından yada arayüzünden oluşturulmuştur.

Amaç nesnelerin yaratımı için bir arayüz sağlamak. Ancak hangi nesnenin yaratılacağı kararını bu arayüzü gerçekleştiren altsınıflara bırakmak.

php.net factory ile ilgili ne demiş :

Factory
The Factory pattern allows for the instantiation of objects at runtime. It is called a Factory Pattern since it is responsible for “manufacturing” an object. A Parameterized Factory receives the name of the class to instantiate as argument.

factory
evet şimdi php.net sayfasındaki örneği kendimize göre düzenleyip inceleyelim.

factory.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Database
{
    // The parameterized factory method
    public static function factory($type)
    {
        if (include_once ($type . '.php')) {
            $classname = $type;
            return new $classname;
        } else {
            throw new Exception ('Driver not found');
        }
    }
}
 
$mysql = Database::factory('mysql');
$mysql->db_connect();
 
$mssql = Database::factory('mssql');
$mssql->db_connect();
?>

Aşağıdaki satırda görüldüğü üzere Database sınıfına $type olarak gönderilen parametre var ise bu parametre adında bir sınıf oluşturmasını ve bize bu sınıfı geri göndermesini istemişiz.

1
2
3
4
        if (include_once ($type . '.php')) {
            $classname = $type;
            return new $classname;
        }

Aşağıdaki kod parçasında Database sınıfına mysql adında bir sınıf türetmesini söylemişiz.

1
$mysql = Database::factory('mysql');

Artık $mysql adında yeni sınıfımızı türettik. Şimdi bu sınıfın elemanlarına ulaşabiliriz.

1
$mysql->db_connect();

Bu kod ekrana mysql.php nin db_connect() methodunu yazdıracaktır. şimdi mysql ve mssql sınıflarını yazalım.

mysql.php

1
2
3
4
5
6
7
8
9
10
<?
class Mysql
{
    // The parameterized factory method
    public function db_connect()
    {
        echo "mysql veritabanına baglandı";
    }
}
?>

mssql.php

1
2
3
4
5
6
7
8
9
10
<?
class Mssql
{
    // The parameterized factory method
    public function db_connect()
    {
        echo "mssql veritabanına baglandı";
    }
}
?>

şimdi yeni bir örnekle bu yazılanları kavramaya çalışalım.

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
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
 
// Bu sınıf butun moduller için ortak bilgileri içerir.
abstract class Modul {
 
    public function bilgiGetir(){
        echo $this->type;
    }
}
 
// Galeri modülü ile ilgili modulleri içerir.
class Galeri extends Modul{
    private $type = "Galeri modülü";
 
    public function bilgiGetir(){
        echo $this->type;
    }
}
 
// Haber modülü ile ilgili modulleri içerir.
class Haber extends Modul{
    private $type = "Haber modülü";
 
    public function bilgiGetir(){
        echo $this->type;
    }
}
 
// Makale modülü ile ilgili modulleri içerir.
class Makale extends Modul{
    private $type = "Makale modülü";
 
    public function bilgiGetir(){
        echo $this->type;
    }
}
 
// Modül fakbirakası.  İstenilen modülü oluşturup, geri gönderir.
class ModulFabrika {
 
    const GALERI = "Galeri";
    const HABER = "Haber";
    const MAKALE = "Makale";
 
    public static function modulOlustur($modul){
        switch($modul){
            case self::GALERI:
                return new Galeri();
                break;
            case self::HABER:
                return new Haber();
                break;
            case self::MAKALE:
                return new Makale();
        }
        throw new Exception ('Modul yuklenemedi.');
    }
 
}
 
// fabrikamızı oluşturalım
$modul = new ModulFabrika();
// modül oluşturalım
$galeri = $modul->modulOlustur(ModulFabrika::GALERI);
// modül bilgisini alalım
$galeri->bilgiGetir();
 
$haber = $modul->modulOlustur(ModulFabrika::HABER);
$haber->bilgiGetir();
 
$makale = $modul->modulOlustur(ModulFabrika::MAKALE);
$makale->bilgiGetir();
 
?>

Yukarıdaki kod bloğunu incelediğimizde yapının aynı olduğunu görürüz. Öncelikle fabrikamızı oluşturuyoruz. Daha sonra çalışacağımız modülü seçiyoruz ve modül bilgisini getiriyoruz.

1
2
3
4
5
6
// fabrikamızı oluşturalım
$modul = new ModulFabrika();
// modül oluşturalım
$galeri = $modul->modulOlustur(ModulFabrika::GALERI);
// modül bilgisini alalım
$galeri->bilgiGetir();
dosya : factory design pattern

Yazıya ek olarak OReilly oluşturduğu fabrika tasarım şablonunu ekliyorum. Örnek olarak onuda inceleyebilirsiniz.

dosya : OReily : factory method design pattern

Bundan sonraki yazımda sizelere singleton veya prototype design pattern hakkında bilgi vereceğim. hangisi hakkında ve ne zaman yazacağıma henüz karar veremedim. belki birazdan onun yazımınada başlayabilirim.

  • Digg
  • del.icio.us
  • Facebook
  • Google
  • BlinkList
  • blogmarks
  • description
  • Furl
  • Ma.gnolia
  • NewsVine
  • Reddit
  • Technorati

benzer konular:

  1. template method design pattern – php
  2. prototype design pattern – php
  3. design patterns (tasarım şablonları)
  4. observer design pattern – php
  5. singleton design pattern – php
  6. design patterns
  7. flyweight design pattern – php
  8. state design pattern – php
  9. builder design pattern – php
  10. proxy design pattern – php


(1 votes, average: 5.00 out of 5)
Loading ... Loading ...

5 yorum

1 | necronomicon

28 / 09 / 2009 - 09:13

Avatar

selam , kolay gelsin. Benim merak ettiğim
router ve kontroller bu ikisi hangi pattern metoduyla yapılıyor?

2 | Emre Çevik

28 / 09 / 2009 - 22:55

Avatar

herşeyi bir patterne uygun olarak düşünmen yanlış. controller ve router bir patterne göre üretilecek diye bir şey yok.

3 | necronomicon

29 / 09 / 2009 - 10:00

Avatar

:) Sanırım öyle bir izlenim verdim.
Yardımların için teşekkür ederim

4 | Gökhan

16 / 02 / 2010 - 01:58

Avatar

Merhabalar,

Benim anlamadığım bir nokta var; nesneleri diğer bir sınıfın metodu ile oluşturmanın ne gibi bir faydası olabilir ? Mesela;

$galeri = $modul->modulOlustur(ModulFabrika::GALERI);
yerine
$galeri = new galeri;

Bunun pratikte nasıl bir farkı var?

5 | Emre Çevik

16 / 02 / 2010 - 02:25

Avatar

mesela ne olabilir. bu modüller icin ortak bi calısacak kod yazarsınız ve her modulden tek tek aynı kontrolu yapmak yerine burdan tek bi kontrol ile yapabilirsiniz.

yorum yaz

ne yapıyoruz

eğleniyoruz?

anket

design pattern yazılarını nasıl buldunuz?

sonuçlar

Loading ... Loading ...