PHP设计模式:单例模式和工厂模式

当需要保证对象只有一个实例的时候,单例模式是非常有用的。他把创建对象的控制权交给一个单一的点上,任何时候应用程序都只会存在且仅存在一个实例。单例类不应该能在类的外部进行实例化。
一个单例类应该具备以下几个因素:

必须拥有一个访问级别为private的构造函数,用于阻止类被随意实例化

必须拥有一个保存类的实例的静态变量

必须拥有一个访问这个实例的公共静态方法,该方法通常被命名为getInstance()

必须拥有一个私有的空的clone方法,防止实例被克隆复制

<?php

namespace __1217;
//单例模式

class Single
{
    //用于保存当前类唯一实例的静态变量
    public static $instance = null;

    //构造方法私有化
    private function __construct()
    {
    }

    //克隆方法私有化
    private function __clone()
    {
    }

    //生成当前类唯一实例的静态方法
    public static function getInstance()
    {
        if(is_null(self::$instance)){

            self::$instance = new self;
        }
        return self::$instance;
    }

    //普通方法
    public function Sayhi()
    {
        echo 'Hi~~';
    }
}
//创建Single的一个实例,$obj1
$obj1 = Single::getInstance();
echo $obj1->Sayhi(),'<br>';

//创建Single的第二个实例,$obj2
$obj2 = Single::getInstance();
//比较$obj1是否等于$obj2,
var_dump($obj1 === $obj2);

输出结果

Hi~~
bool(true)

工厂模式

工厂模式解决的是如何不通过new建立实例对象的方法

工厂模式是一种类,它具有为你创建对象的某些方法,你可以使用工厂类创建对象而不使用new。这样,如果你想要更改所创建的对象类型只需要更改工厂即可,使用该工厂的所有代码会自动更改。
工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类就可以方便的使用了。

<?php

//创建一个Person接口
interface Person
{
    //接口中的方法,必须是public性质的
    public function showInfo();
}

//创建一个Student类,实现Person接口
class Student implements Person
{
    //实现接口中的showInfo方法
    public function showInfo()
    {
        echo '访问了学生类中的方法~';
    }
}
//创建一个Teacher类,实现Person接口
class Teacher implements Person
{
    public function showInfo()
    {
        echo '访问了
        教师类中的方法';
    }
}
//创建一个人类工厂
class PersonFactory
{
    public static function factory($person_type)
    {
        //将传入的类型首字母大写
        $class_name = ucfirst($person_type);
        if(class_exists($class_name)){
            return new $class_name;
        }else{
            throw new Exception("类:$class_name 不存在",1);
        }
    }
}

//创建第一个学生实例
$student1 = PersonFactory::factory('student');
echo $student1->showInfo().'第一个实例';
echo '<br>';
//创建第二个学生实例
$student2 = PersonFactory::factory('student');
echo $student2->showInfo().'第二个实例';
echo '<br>';

$teacher = PersonFactory::factory('teacher');
echo $teacher->showInfo();

输出结果

访问了学生类中的方法~第一个实例
访问了学生类中的方法~第二个实例
访问了 教师类中的方法

  

posted @ 2019-12-19 15:49  专门写bug  阅读(110)  评论(0编辑  收藏  举报