PHP构造型设计模式

1.构造者Builder

  • 用于创建一个复杂对象
  • 一个对象需要依赖于大量外部对象或者其他设置参数,通过构造方法创建太复杂
class Query 
{
    private $selects = [];
    private $froms = [];
    public function setSelects(array $selects) {
    }

    public function getResult() {
    }
}

class QueryBuilder 
{
    private $query;

    public function addSelect($select) {
        return $this;
    }

    public function build() {
        return $this->query;
    }
}
$query = (new QueryBuilder())->addSelect('user')->andWhere('uid',1)->build();
$user = $query->getResult();

适用场景

  • 对象的创建非常复杂,总是需要配置和先创建其他对象
  • 构造者通过相同步骤可创建不同的对象

2.单例模式Singleton

  • 全局只有一个类的对象
  • 私有化构造方法和克隆方法
  • 通过静态方法创建并保持方法
  • 注意:实例化方法需要线程安全
class Singleton 
{
    private static $instance;

    private function __clone() {}
    private function __construct() {}

    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;        
    }
}

$instance = Singleton::getInstance();

适用场景

  • 类的对象全局唯一
  • 节约频繁创建对象的资源开销
  • 单例类必须是无状态的

3.抽象工厂Abstract Factory

  • 使用与实现分离
  • 调用方只依赖于业务逻辑接口,与具体实现无关
interface UserRepository 
{
    public function findOne($id) {}
    public function findAll() {}
}
interface RepositoryFactory 
{
    public function createUserRepository() {}
}
class Client 
{
    private $repositoryFactory;

    public function __construct(RepositoryFactory $factory) {
        $this->$repositoryFactory = $factory;
    }

    public function doSomething() {
        $userRepository = $this->repositoryFactory->createUserRepository();
        $oneUser = $userRepository->findOne(1);
    }
}

业务实现(MySQL)

class MySqlRepositoryFactory implements RepositoryFactory 
{
    private $pdo;
    public function __contruct() {
        $this->pdo = new PDO();
    }
    public function createUserRepository() {
        return new MySqlUserRepository($this->pdo);
    }
}
class MySqlUserRepository implements UserRepository 
{
    private $pdo;
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }
    public function findOne($id) {
        $sql = 'SELECT * FROM t_user WHERE uid = ?';
        return $result;
    }
    public function findAll() {
        return $result;
    }
}

业务实现(计算器)

abstract class BaseRule
{
    protected $dataArr = [];
    public function addData($data) {
        foreach ($data as $key=>$value) {
            $this->dataArr[$key] = $value;
        }
    }
    abstract function cal();
}
class RuleFactory extend Object 
{
    public function getRule($className) {
        if (!$className) {
            return null;
        } else {
            $class = '\\common\\services\\'.$className.'Rule';
            return new $class();
        }
    }
}
class AccumulationRule extends BaseRule
{
    public function cal() {
        //do something
    }
}

//实例化对象
$ruleInstance = (new RuleFactory())->getRule('Accumulation');
$ruleInstance->addData($data);
$ruleInstance->cal();

适用场景

  • 剥离调用者和实现的耦合
  • 调用者、实现代码可以分开测试
  • 案例: JDBC API & Driver

摘自: 网络PDF,来源已找不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值