工厂模式:使用工厂类使创建类与使用类分离,从而提高代码的易维护性,可扩展性等
工厂模式分位简单工厂模式和工厂方法模式
使用简单工厂模式的步骤:
1、创建父类及其子类
父类中有[抽象]方法,在子类中实现。(父类可以是普通类,也可以是抽象类)
2、创建工厂类
有静态工厂方法,通过逻辑判断创建不同实例,返回父类类型
例如://算法父类
abstract class YunSuan{
abstract function YunSuan();
}
//加法的子类
class Jia extends YunSuan{
function YunSuan(){
echo "这是加法";
}
}
//减法的子类
class Jian extends YunSuan{
function YunSuan() {
echo "这是减法";
}
}
//工厂类,通过逻辑判断创建不同实例
class GongChang{
static function DuiXiang($f) {
switch($f) {
case "+":
return new Jia();
break;
case "-":
return new Jian();
break;
}
}
}
//测试
$r = GongChang::DuiXiang("-");
$r->YunSuan();
简单工厂模式对于扩展的实现挺好,但是修改的话就不是很方便,你需要在工厂类中添加逻辑判断等
使用工厂方法模式的步骤:
1、创建父类及其子类
//同上
2、创建工厂类及其子类
工厂类中没有具体实现,通过子类实例化创建具体对象 abstract class GongChang{
abstract static function DuiXiang();
}
//jia子类
class jiafa extends GongChang{
function DuiXiang(){
return new jia();
}
}
//jian子类
class jianfa extends GongChang{
function DuiXiang(){
return new jian();
}
}
//测试
$gc = new DuiXiang(); $ys = $gc->jiafa();
$ys->jia();
使用工厂方法模式就完全符合开闭原则了,针对扩展开放,针对修改关闭,不用去修改任何已有的代码,只需要添加子类或者删除子类就行了
单例模式:控制创建对象的个数
class DA{
public $name;
static private $dx;//存放对象的变量
//将构造变为私有,外界没法造对象
private function __construct(){
}
//提供一个造对象的方法
static function CreateDX(){
if(empty(self::$dx)){
self::$dx = new DA();
}
return self::$dx;
}
}
$d = DA::CreateDX();
$d1 = DA::CreateDX();
$d1->name = "lisi";
var_dump($d==$d1);