工厂模式 and 单例模式

工厂模式:使用工厂类使创建类与使用类分离,从而提高代码的易维护性,可扩展性等

工厂模式分位简单工厂模式工厂方法模式
使用简单工厂模式的步骤:
    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);

原文地址:https://www.cnblogs.com/yongjiapei/p/5570358.html