php面向对象单例模式、工厂模式及6大原则

一.单例模式
目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)
做法
1.将类的构造函数做成私有的
2.在类里面做了一个公有的函数来造对象
3.将该函数变为静态的
4.在函数里面加控制

class Ren
{
  public $name;

  static public $dx;                  //静态成员变量用来存储该对象
  private function __construct()     //把构造函数设置为私有,类的外部就不能用new造对象了
  {
  } 

  static function DuiXiang()         //做一个静态的方法,用来在类的内部造对象
  { 

    if(empty(self::$dx))               //判断上面定义的变量是否有值,如果没有,就造一个对象,如果有,就直接输出这个
    {
      self::$dx = new Ren();             //因为是静态变量,只能用类名调用
    }
    return self::$dx;                  

  }
} 
$r = Ren::DuiXiang(); 

$r->name = "张三";
 $r1 = Ren::DuiXiang();
 $r1->name = "李四";
 var_dump($r);              //由于上面已经造了一个对象$r,所以当再造$r1时,$r1跟$r是一样的对象


二、工厂模式

abstract class YunSuan           //用abstract关键字  把类定义为抽象类
{
  public $a;
  public $b;
  //第一个suan函数是普通类
  function Suan()
  {
  }
}

class Jia extends YunSuan
{
  function Suan()
  {
    return $this->a+$this->b;
  }
}

class Jian extends YunSuan
{
  function Suan()
  {
    return $this->a-$this->b;
  }
}

class Cheng extends YunSuan
{
  function Suan()
  {
    return $this->a*$this->b;
  }
}

//做一个工厂类
class GongChang
{
  static function ShengChan($fuhao)        //给它一个变量,随着变量的不同  函数返回的值就不同
  {
      switch($fuhao)
    {
      case "+":
      return new Jia();
      break;
      case "-":
      return new Jian();
      break;
      case "*":
      return new Cheng();
      break;
    }
  }
}

//算加法
$suan = GongChang::ShengChan("*");
$suan->a = 10;
$suan->b = 5;
echo $suan->Suan();


静态方法可以调静态变量,但不能调普通变量

普通方法可以调静态变量,也可以普通变量



OOP基本上有6大原则,而实际上都是互补的,也就是说一些原则需要利用另一些原则来实现自己。6大原则如下:

1) Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。

2) Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类。

3) Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能,这个原则也是另一篇文章《Design by Contract》的基石。

4) Interface Segregation Principle(ISP),接口隔离原则,“将大的接口打散成多个小接口”,这样做的好处很明显,我不知道有没有必要再继续描述了,为了节省篇幅,实际上我对这些原则只是做了一个小总结,如果有需要更深入了解的话推荐看《Java与模式》,MS MVP的一:本巨作!^_^

5) 单一职责:一个类的功能尽量单一,降低耦合

6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到正式运用,所以定义为迪米特法则。它讲的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则。

时间: 2024-08-01 20:10:29

php面向对象单例模式、工厂模式及6大原则的相关文章

php基础---单例模式&&工厂模式

//PHP设计模式 //工厂模式:工厂类 用于创建对象 interface Dongwu { function say(); } class Mao implements Dongwu { public function say() { echo "喵喵!我是一只小野猫!"; } } //工厂类,用来创建猫类 class GongChang { public static function GetObj($className) { return new $className(); }

单例模式工厂模式

单例模式 单例模式的目的就是为了控制特定的类只产生一个对象. 产生单例的步骤: 1.构造方法私有化(在构造方法前面加prevate static finall)为的是不让其他类创建该类的实例化对象. 2.在类中自己创建自己的实例化对象. 3.写一个方法,返回该实例化对象. 4.在该类中还可以写其他的方法. 具体的代码如下: public class Danli { // 构造方法私有化,让其他类调用不到 private Danli() { } // 在类中自己创建自己的实例化对象, privat

PHP 设计模式 单例模式 工厂模式 注册模式

1.工厂模式,工厂方法或者类生成对象,而不是在代码中直接new 2.单例模式,使某个类的对象仅允许创建一个 3.注册模式,全局共享和交换对象 项目文件目录 入口文件 index.php 1 <?php 2 /** 3 * Created by PhpStorm. 4 * Author: Administrator 5 * Date: 14-11-22 6 * Time: 下午3:42 7 */ 8 9 define('BASEDIR',__DIR__); 10 include BASEDIR.'

面向对象之工厂模式和构造函数模式

工厂模式:用函数来封装,以特定接口来创建对象的细节. 创建的对象是Object类型 function person(name, age , job){ var o =new Object() ; o.name = name; o.age = age ; o.job = job ; o.sayName = function(){ alert(this.name); }; return o ; var person1 = new person("cancan",21,"stude

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

大话设计模式C++版——工厂模式在COM中的典型应用

上篇<大话设计模式C++版--抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案--COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式违背开放-封闭原则的根本原因在于对象的产生无法通过客户模块外的数据进行控制,如果我们能从xml.注册表.配置文件中写入一个类的名字,然后模块从中读出类名,并根据读出的类名创建对象,那不就和C#高大上的反射技术一样牛B哄哄了.非常幸运,微软的COM组件技术就提供了这么一个平台. 1.COM组件是神马 为了节约篇

设计模式三:抽象工厂模式

抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽象工厂模式又称为Kit模式,它是一种对象创建型模式. 在抽象工厂模式结构图中包含如下几个角色: ● AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品.   ● ConcreteF

工厂模式编程

面向对象版工厂模式 整体下来感觉就是方便扩展.程序更健壮,输入参数 内部根据不同的需求进行处理 然后再归并到一起 与mapreduce思想类似 准备 工作 归并 开始 原文地址:https://www.cnblogs.com/webster1/p/8640721.html

5.抽象工厂模式-abstractfactory

初识抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 结构和说明 AbstractFactory:? 抽象工厂,定义创建一系列产品对象的操作接口. ConcreteFactory:? 具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建. AbstractProduct:? 定义一类产品对象的接口 ConcreteProduct:? 具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对