Bu Fabrika Pattern nasıl işliyor?

5 Cevap php

Bana hemen anlamak için Singleton ve Kayıt desenler çok basit ve kolay ama Fabrika desen henüz 100% yorumlamak için beynimi almak mümkün olmamıştır şey olmuştur. Ben şimdi anlıyorum düşünüyorum, aşağıda örnek bir kod yazdı, gözden ve bu Fabrikası desen doğru kullanımı olup olmadığını söyle lütfen. Örnek PHP olduğunu ...

<?php
 /**
 *   Factory.class.php
 */
class Factory {
    public static $_database;
    public static $_cache;
    public static $_session;

    // Build our User object with all it's dependencies  
    public static function makeUserObject()
    {
        $user = new User();
        $user->setDatabaseObject(self::$_database);
        $user->setCacheObject(self::$_cache);
        $user->setSessionObject(self::$_session);
        return $user;
    }

    // other objects will be here someday......
}

/**
 *  User.class.php
 */
class User
{
    public function __construct() { }

    // inject Database Object
    public function setDatabaseObject($databaseConnectionObject)
    {
        $this->_databaseObject = $databaseConnectionObject;
    }

    // inject Cache Object
    public function setCacheObject($cacheObject)
    {
        $this->_cacheObject = $cacheObject;
    }

    // inject Session Object
    public function setSessionObject($sessionObject)
    {
        $this->_sessionObject = $sessionObject;
    }

    // other methods here for User object...........
}

/**
 *  index.php  Main page that puts it all together
 *  assume that classes are autoloaded into this page already
 */
// Set our Database + Cache + Session objects into the Factory Object
Factory::$_database = new Databse();
Factory::$_cache = new Cache();
Factory::$_session = new Session();

// Create our User object
// The factory class will build the User object and inject all
// it's dependencies for us =)
$user = Factory::makeUserObject();

?>

Yani temelde Veritabanı, Önbellek ve Session nesneleri Ben bu 3 bağımlılıkları herhangi bir ihtiyacınız olacak her nesne için fabrika sınıfındaki bir yöntem kurmak, sonra da Fabrika nesnesine eklenir (burada gösterilmemiştir) oluşturulan ve elimden edilir onlar da olsun ayarlanmış hangileri. Ben fabrika nesnesi olmadan istiyorsa ben orada doğrudan bağımlılıkları enjekte gibi tek tek sınıfları hala biraz taşınabilir olabilir Bu da nerede yapar. Bu doğru geliyor mu? Eğer bu doğruysa, bu gerçekten kullanışlı geliyor


UPDATE # 1

Bu burada bu ben http://www.potstuck.com/2009/01/08/php-dependency-injection/ bir "fabrika" olarak bakın burada okunan bir blog yazısı kapalı dayanır, ben bir Registry kullanıyorum ve bir sürü insan bir "fabrika" içine bakmak bana tutmak ve Ben bu artcle okudum ama bir "fabrika" değil gibi görünüyor kadar bu konuda okuduğum her şey sadece kafamda tıklayın vermedi?


UPDATE # 2
From wikipedia http://en.wikipedia.org/wiki/Factory_object In object-oriented computer programming, a factory object is an object for creating other objects. It is an abstraction of a constructor, and can be used to implement various allocation schemes, such as the singleton pattern. A factory object typically has a method for every kind of object it is capable of creating. These methods optionally accept parameters defining how the object is created, and then return the created object. Factory objects are used in situations where getting hold of an object of a particular kind is a more complex process than simply creating a new object. The factory object might decide to create the object's class (if applicable) dynamically, return it from an object pool, do complex configuration on the object, or other things.

Yani belki de bu afterall bir şekilde bir "Fabrika nesne" dir ...

5 Cevap

Summarized and extended my comments from below the question here

Diğerleri dediğim gibi, bu, bu adla bir model yok çünkü bir Factory değildir. Ya bu bir AbstractFactory veya FactoryMethod, pragmatik insanlar genellikle Factory ya da sadece söyleyerek bakın ve o benimle iyi olsa.

Oturum, Önbellek ve DB genellikle erken uygulama akışında başlatmak olacak bir şey vardır, bu nedenle bu temelde bootstrap eseridir. Ben ne arıyorsun çok creation nesnelerin değil izlenimini almak, ama onların handling uygulama boyunca. Bu bir FactoryWhatever ne gelen biraz farklı bir endişe bulunuyor.

Sanki tam bir FactoryWhatever, kod kötü olduğu anlamına gelmez, sırf yorum dedi. Bu sorunu çözer, o serin. Ama ben yine de, ne yapmaya çalışıyorsun ne düşünüyorum, örneğin oluşturma and zamanında kaynakları yönetimi iyi bir DI Service Container ile birlikte kullanılır.

Bunun için bir DI Kabı now kullanmak istemiyorsanız, size Zend_Application and how they bootstrap resources bir göz olabilir. Bu bir alternatif olduğunu ve add DI containers later. için olasılığı bırakır

Aslında, önceki sorularda konuların oldukça çok, örneğin, zaten Zend Framework çözüldüğünü Yapılandırma sınıfları. Ben ZF kullanmayın demiyorum, ama onlar şeyler yapmak nasıl görmek için kontrol edebilir. Tabii ki, çok other frameworks bakabilirsiniz.

Bazı desen PHP örneklerle siteler:

Yani tamam fabrika desen, ama sadece bunu Factory çağırmak daha iyi bir adlandırma gerekebilir. Ayrıca bağımlılık enjeksiyon izlerini barındırıyor.

Eğer teknik fabrika kalıbı diyebiliriz rağmen, muhtemelen desen iyi bir kullanım değil. Fabrika doğrudan sınıfları ve fabrika tasarımı sırasında en iyi sonuçları almak, akılda tutmak vb tam yapıcı parametreleri gibi sınıf isimleri ve nesne oluşturma referans kodunuzu kapsüller bir yaradılış kalıptır.

Örneğin, StackOverflow onların itibar puanı bağlı olarak kullanıcılara farklı haklar verir. Varsayımsal olarak konuşursak, bu kullanıcıların aşağıdaki türde olabilir:

NewbieUser      [1-100]
BeginnerUser    [101-1000]
AverageJoeUser  [1001-5000]
VeteranUser     [5001-20000]
PowerUser       [20001-50000]
GodModeUser     [50001-100000]

ve bir kullanıcı temsilcisi bakarak tarafından oluşturulmuş olabilir. ve doğrudan sınıf başvurarak ilgili kullanıcı nesnesinin örneğini. Jon Skeet merak ediyorsanız durumda herhangi bir kategoride görünmüyor. Burada doğrudan örnekleme ile berbat bir uygulama var:

if(reputation >= 1001 and reputation <= 5000) {
    AverageJoeUser user = new AverageJoeUser();
}

Daha sonra yolda biz sınıf adlarını veya kullanıcıların örneği alındı ​​biçimini değiştirmek için olsaydı, nesnenin oluşturulduğu her tür örneği bulunamadı ve değiştirilmesi gerekir. Çalışmalarının oldukça bir sürü bana sorarsanız. Biz burada Fabrika deseni kullanılmış olsaydı yerine, değişim Fabrikası sınıf içinde tek bir yöntemle giderdim.

class UserFactory {
    public static User createUser(Integer reputation) {
        ...
    }
}

Benim için bir fabrika gibi bakmak does't - Bir iç-oluşturucu olabilir;? 0)

Fabrika uygulama ve örnekleme gizleme bir yoludur. Ve orada yapılan bazı montaj genellikle, ama kısaca ....

  public interface IUser
    {
        void DoSomething();
    }

    public class DumbUser : IUser
    {

        public void DoSomething()
        {
            // duh... what should i do?
        }

    }

    public class SmartUser : IUser
    {

        public void DoSomething()
        {
            // calclulating prime numbers while baking bread
        }

    }


    public class UserFactory
    {
        public static IUser CreateUser()
        {
            Random r = new Random(Environment.TickCount);

            return r.Next(10) > 5 ? (IUser) new SmartUser() : new DumbUser();
        }
    }

    public class YourProgram
    {
        public void Run()
        {
            IUser user = UserFactory.CreateUser();
            user.DoSomething();
        }
    }

Bu sadece bir kullanıcı oluşturmak istiyorum görünüyor beri, ben bundan böyle sadece fabrika olarak adlandırılan soyut bir faktör için gerek görmüyorum. Fabrikaların fikri belirli bir arabirim uygulamak nesneler yaratmak için olduğunu. Sen aynı arayüzü iki farklı uygulama örneğini edebilmek isterdim. Nokta ve üzerinde bu nesneleri oluşturmak zorunda, ve kod üzerinde tüm hantal ObjectB için Objecta onu changig olmasıdır. Genellikle bir tek çünkü fabrika alıp, kolaydır.

Fabrika yöntemin fikri çerçeveler ile ilgili: Bazı çerçeve kodu bir kullanım oluşturmak istiyorum, ama gerçek kullanıcı uygulama türetilmiş sınıfları, yani kendi app yazmaya çerçevesinin kullanıcıları vardır içinde - Eğer söylemek gerektiğinde olduğunu Eğer çerçevenin kullanıcı fabrika yöntemi için bir çağrı olan "şimdi bir kullanıcı nesnesi oluşturmak". Kullanıcı bu uygulamak gerekir. Ayrıca GOF göre bir Sanal Contstructor denir.

Burada gerçekten böyle değil nesnenin farklı temsilleri, varken oluşturucu genellikle kullanılır. Benim gözümde, önbellek, veritabanı ve oturum böylece ilgili inceliklerini dinmekte, tekil olarak uygulanabilir. Aksi takdirde, ben Sonra, kullanıcı nesnesi (ve pek çok diğer nesneler) için konumlayıcıyı geçmek olurdu GetDatabase, GetSession yapmanız gereken bir ServiceLocator, vb kullanmanızı öneririm oluşturma. Baş, bu lokasyon farklı sınıflar arasında tekrar edilebilir olmasıdır.

Bana daha Oluşturucu desen gibi görünüyor. Aslında AbtractFactory veya FactoryMethod, hangi fabrika desen demek istedi? Ancak, veraset ve size kod ile iki anlaşma sadece bir "kompleks" nesne toplanır.