设计模式之简单工厂

[TOCM]

使用目的

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类,避免在业务中去new 对象。这样做的好处是,将我们许多的业务使用到对具体类的实现依赖转移到了工厂类里面,在我们以后想替换实现的时候只需要修改工厂,而不需要去每个业务(上游代码)里面修改类替换。这样做的好处是对于上游代码来说,我们不依赖于具体实现,我们只依赖与工厂,达到了解构的效果。

简介

简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。而如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,这违反了开放封闭原则(对扩展开放,对修改关闭), 此时就可以考虑使用抽象工厂

代码示例

//抽象DB接口
interface DB {
    public function connect ();
}

//mysql
class mysqlDb implements DB {
    public function connect () {
        echo 'this is obj of mysql;';
    }
}

//oracle
class oracleDb implements DB {
    public function connect () {
        echo 'this is obj of oracle;';
    }
}


/**
 * 简单工厂实现1
 * Class SimpleFactory
 */
class SimpleFactory
{
    /**
     * @var array
     */
    protected $typeList;

    public function __construct()
    {
        $this->typeList = [
            mysqlDb::class,
            sqlServerDB::class
        ];
    }

    /**
     * 创建db
     * @param $type
     * @return mixed
     * @throws Exception
     */
    public function create($type)
    {
        if (!array_key_exists($type, $this->typeList)) {
            throw new \Exception("$type is not valid");
        }
        $className = $this->typeList[$type];

        return new $className();
    }
}

/**
 * 简单工厂类实现2
 * Class SimpleFactory2
 */
class SimpleFactory2
{
    // 创建对象
    public function create($type)
    {
        switch($type) {
            case mysqlDb::class:
                return new mysqlDb();
                break;
            case sqlServerDB::class:
                return new sqlServerDB();
                break;
            default:
                return false;
                break;
        }
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注