手记

【九月打卡】第4天--大话PHP设计模式第五章节三种基础设计模式

课程名称:大话PHP设计模式

课程章节: 5-1 基础设计模式简介 5-2工厂模式 5-3单例模式 5-4注册树模式
课程链接

主讲老师:Rango

课程内容:

PHP三种基础设计模式简介,然后分别介绍了三种设计模式及其各自的使用方法

课程收获:

1、工厂模式,由于课程只说了简单工程模式,其实还有其他几种,这里一起讲述。

简单工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。

优缺点:优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;缺点在于工厂类不够灵活,增加新的产品时需要修改工厂类的代码,一旦产品较多时,工厂类将会变得异常复杂。

class A
{
    function __construct()
    {
        echo "我是A类";
    }
}

class B
{
    function __construct()
    {
        echo "我是B类";
    }
}

class Factory
{
    public static function create($name)
    {
        if ($name == 'A') {
            return new A;
        } elseif ($name == 'B') {
            return new B;
        }
    }
}

$a = Factory::create('A');
$b = Factory::create('B');

工厂方法模式:通过定义了一个抽象出来的核心工厂类,并同时定义创建产品对象的接口,而创建具体实例的工作延迟到工厂子类中去完成。

优缺点:工厂方法模式是在简单工厂模式的基础上进一步的抽象,保留了简单工厂模式的优点,且解决了它的缺点。在工厂方法模式中,核心类仅仅负责给出具体工厂必须实现的接口,而无需再负责具体的产品类实例化,使得系统可以在不修改整体代码的情况下方便的引进新的产品。

interface Basic
{
    public function actionOne();

    public function actionTwo();
}

class A implements Basic
{
    public function actionOne()
    {
        echo "我是A类 方法One";
    }

    public function actionTwo()
    {
        echo "我是A类 方法Two";
    }
}

class B implements Basic
{
    public function actionOne()
    {
        echo "我是B类 方法One";
    }

    public function actionTwo()
    {
        echo "我是B类 方法Two";
    }
}

abstract class Factory
{
    abstract static function createBasic();
}

class AFactory extends Factory
{
    public static function createBasic()
    {
        return new A;
    }
}


class BFactory extends Factory
{
    public static function createBasic()
    {
        return new B;
    }
}



$a = AFactory::createBasic();
$a->actionOne();
$a->actionTwo();
 
$b = BFactory::createBasic();
$b->actionOne();
$b->actionTwo();

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

优缺点:此模式是在工厂方法模式上的进一步扩展。在工厂方法模式中,一个具体工厂负责一类具体产品的处理(一对一关系),但当我们需要一个工厂负责生成多种类型产品时,就要抽象整个工厂类了。

interface Phone
{
    public function open();
 
    public function operate();
}
 
class HuaweiPhone implements Phone
{
    public function open()
    {
        echo "打开华为手机";
    }
 
    public function operate()
    {
        echo "操作华为手机";
    }
}
 
interface Bracelet
{
    public function look();
 
    public function click();
}
 
class XiaomiBracelet implements Bracelet
{
    public function look()
    {
        echo "查看小米手环";
    }
 
    public function click()
    {
        echo "点击小米手环";
    }
}
 
abstract class Factory
{
    abstract public static function createPhone();
 
    abstract public static function createBracelet();
}
 
class ProductFactory extends Factory{
    public static function createPhone()
    {
        return new HuaweiPhone();
    }
 
    public static function createBracelet()
    {
        return new XiaomiBracelet();
    }
}
 
$newPhone = ProductFactory::createPhone();
$newPhone->open();
$newPhone->operate();
 
$newBracelet = ProductFactory::createBracelet();
$newBracelet->look();
$newBracelet->click();

2、单例模式

单例模式:一个类是能有一个实例,并提供一个当前类的全局唯一访问入口。防止类被多次实例化和clone

class Database
{
    protected static $db;

    private function __construct()
    {
        
    }
    
    private function __clone()
    {
        
    }
    
    static function getInstance()
    {
        if(self::$db) {
            return self::$db;
        } else {
            self::$db = new self();
            return self::$db;
        }
    }
}


$db = Database::getInstance();

3、注册树模式

注册树模式:将一些常用的基础类库,比较零散的类库,通过注册树模式挂载到注册树上面,在使用的时候直接获取,便于管理


class Register
{
    /**
     * 注册树池子
     * 将实例对象挂载到 $objects
     * @var null
     */
    protected static $objects = null;
 
    /**
     * 将对象挂载到树上
     * @param $key
     * @param $object
     */
    public static function set($key, $object)
    {
        self::$objects[$key] = $object;
    }
 
    /**
     * 从树上获取对象,如果没有,注册
     * @param $key
     * @return mixed
     */
    public static function get($key)
    {
        if (!isset(self::$objects[$key])){
            self::$objects[$key] = new $key;
        }
        return self::$objects[$key];
    }
 
    /**
     * 卸载
     * @param $key
     */
    public static function _unset($key)
    {
        unset(self::$objects[$key]);
    }
}


class A
{
    //类库示例
    public function adc()
    {
        return 'abcd';
    }
}

namespace app\controller;
 
use app\BaseController;
use A;
class Index extends BaseController
{
  
    public function register()
    {
        $a = new \A();
        $abc = \Register::get('a')->adc();    
        }
}

课程截图



0人推荐
随时随地看视频
慕课网APP