<?php

namespace DesignPatterns;

/**
 * Factory Method pattern
 *
 * Purpose:
 * similar to the AbstractFactory, this pattern is used to create series of related or dependant objects.
 * The difference between this and the abstract factory pattern is that the factory method pattern uses just one static
 * method to create all types of objects it can create. It is usually named "factory" or "build".
 *
 * Examples:
 * - Zend Framework: Zend_Cache_Backend or _Frontend use a factory method create cache backends or frontends
 * 
 */
class FactoryMethod
{
    /**
     * the parametrized function to get create an instance
     *
     * @static
     * @return Formatter
     */
    public static function factory($type)
    {
        $className = 'Format' . ucfirst($type);
        if ( ! class_exists($className)) {
            throw new Exception('Missing format class.');
        }

        return new $className();
    }
}

interface Formatter
{

}

class FormatString implements Formatter
{

}

class FormatNumber implements Formatter
{
    
}