C1:工厂模式 Factory

最常用的实例化对象模式,用工厂方法替代了实例化对象.

应用场景:
A.一个类的子类经常面临着剧烈变化,但却拥有较稳定的接口,或者说拥有相同的接口.工厂方法定义一个用于创建对象的接口,让子类来决定创建那个对象,将对象的实例化延迟.
B.如给定一张图片,生成对应的图片并添加水印.图片格式有png,jpg等,但他们都需要创建图片,添加水印等方法.
C.工厂接口根据参数来创建不同的子类对象,提供不同类型的相同方法.

1.简单工厂:
工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关类,对于客户端来说,去除了与相关产品的依赖,但随着条件的增多,判断逻辑会增多.

UML图:

实例代码:

abstract class DbServer
{
    protected $link;
    public function __construct()
    {

    }

    abstract public function connect();

}

class MySQL extends DbServer
{
    public function connect()
    {
        // TODO: Implement connect() method.
    }

}

class SqlServer extends DbServer
{
    public function connect()
    {
        // TODO: Implement connect() method.
    }
}



class DbFactory
{
    const MYSQL = 'MySQL';
    const SQLSERVER = 'SqlServer';

    public static function createDb($type)
    {
        switch ($type) {
            case self::MYSQL:
            case self::SQLSERVER:
                return new $type();
            default:
                throw new \Exception("{$type} class is not exist");
        }
    }
}

$db = DbFactory::createDb(DbFactory::MYSQL);
$db->connect();

  

 

 

2.工厂方法:

定义一个用于创建对象的接口,让子类决定实例化那个类,工厂模式是一个类的实例化被延迟到子类.

UML图:

示例代码:

abstract class DbServer
{
    protected $link;
    public function __construct()
    {

    }

    abstract public function connect();

}

class MySQL extends DbServer
{
    public function connect()
    {
        // TODO: Implement connect() method.
    }

}

class SqlServer extends DbServer
{
    public function connect()
    {
        // TODO: Implement connect() method.
    }
}

interface FactoryInterface
{
    public static function createDb();
}

class MySqlFactory implements FactoryInterface
{

    public static function createDb()
    {
        return new MySQL();
    }
}

class SqlServerFactory implements FactoryInterface
{

    public static function createDb()
    {
        return new SqlServer();
    }
}

$db = SqlServerFactory::createDb();
$db->connect();

  

 

 

posted @ 2017-11-04 09:52  rorshach  阅读(308)  评论(0编辑  收藏  举报