发表于 2018-03-20 09:43
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
当需要保证对象只有一个实例的时候,单例模式是非常有用的。他把创建对象的控制权交给一个单一的点上,任何时候应用程序都只会存在且仅存在一个实例。单例类不应该能在类的外部进行实例化。
一个单例类应该具备以下几个因素:
必须拥有一个访问级别为private
的构造函数,用于阻止类被随意实例化
必须拥有一个保存类的实例的静态变量
必须拥有一个访问这个实例的公共静态方法,该方法通常被命名为getInstance()
必须拥有一个私有的空的clone
方法,防止实例被克隆复制
简单实例:
class Single{ public static $_instance; private function __construct() { } private function __clone() { } public static function getInstance() { if (!self::$_instance) { self::$_instance = new self(); } return self::$_instance; } public function sayHi() { echo "Hi n"; }
} $single = Single::getInstance(); $single->sayHi();
工厂模式解决的是如何不通过new
建立实例对象的方法
工厂模式是一种类,它具有为你创建对象的某些方法,你可以使用工厂类创建对象而不使用new
。这样,如果你想要更改所创建的对象类型只需要更改工厂即可,使用该工厂的所有代码会自动更改。
工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类就可以方便的使用了。
简单举例:
/** * 抽象出一个人的接口 * Interface Person */interface Person{ public function showInfo(); }/** * 一个继承于抽象人接口的学生类 * Class Student */class Student implements Person{ public function showInfo() { echo "这是一个学生 n"; } }/**
* 一个继承于抽象人接口的老师类 * Class Teacher */class Teacher implements Person{ public function showInfo() { echo "这是一个老师 n"; } }/** * 人类工厂 * Class PersonFactory */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();
Copyright © 2022.Company name All rights reserved. 冀ICP备14009098号-3
评论
您发表的评论需要审核通过后才会展示在评论区内,请勿重复评论!