首先分享一个地址 https://segmentfault.com/a/1190000013696265(这个是主要的分享,人家作者写的非常棒)
单例模式:对于这个大家当然感觉很简单,so easy,但我们需要知道其原理
当需要保证对象只有一个实例的时候,单例模式是非常有用的。他把创建对象的控制权交给一个单一的点上,任何时候应用程序都只会存在且仅存在一个实例。单例类不应该能在类的外部进行实例化。
一个单例类应该具备以下几个因素:
- 必须拥有一个访问级别为
private
的构造函数,用于阻止类被随意实例化 - 必须拥有一个保存类的实例的静态变量
- 必须拥有一个访问这个实例的公共静态方法,该方法通常被命名为
getInstance()
- 必须拥有一个私有的空的
clone
方法,防止实例被克隆复制
class single{
public static $_instance;
private function __contruct(){
}
public static function getInstance(){
if(!self::$_instance){
self::$_instance = new self();
}
return self::$_instance;
}
private function __clone(){}
}
工厂模式
工厂模式解决的是如何不通过new
建立实例对象的方法
工厂模式是一种类,它具有为你创建对象的某些方法,你可以使用工厂类创建对象而不使用new
。这样,如果你想要更改所创建的对象类型只需要更改工厂即可,使用该工厂的所有代码会自动更改。
工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类就可以方便的使用了。
interface Person
{
public function showInfo();
}
class Student implements Person
{
public function showInfo()
{
echo "这是一个学生 \n";
}
}
class Teacher implements Person
{
public function showInfo()
{
echo "这是一个老师 \n";
}
}
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);
}
}
}
// 需要一个学生
$student = PersonFactory::factory('student');
echo $student->showInfo();
// 需要一个老师的时候
$teacher = PersonFactory::factory('teacher');
echo $teacher->showInfo();