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,来源已找不到