##设计模式##
###三大类(23种模式) ####1. 创建型的类: #####工厂模式 Factory
<?php
//通过你这个加工厂, 你就帮我返回 实例化这个类
//instance 实例
class Factory{
//需要实例化的类名称
public function getIns($name){
//require() 判断文件是否存在 引入文件
//可变类
$ins = new $name();
//返回实例化后得到的对象''
return $ins;
}
}
//得到一个A类的对象
var_dump(Factory::getInt("A"));
//得到一个B类的对象
var_dump(Factory::getInt("B"));
//得到一个A类的对象
var_dump(Factory::getInt("A"));
?>
######例子 计算机
<?php
//计算机抽象类
abstract class Jisuan{
abstract public function getVlue($num1, $num2);
}
//加法类
class Numadd extends Jisuan{
public function getVlue($num1, $num2){
return $num1 + $num2;
}
}
//减法类
class NumSub extends Jisuan{
public function getVlue($num1, $num2){
return $num1 - $num2;
}
}
//乘法类
class NumMul extends Jisuan{
public function getVlue($num1, $num2){
return $num1 * $num2;
}
}
//除法类
class NumDiv extends Jisuan{
public function getVlue($num1, $num2){
if($num2 != 0){
return $num1 / $num2;
}
}
}
//工厂---->按照我要的操作, 返回两个数的运算结果
class Fatory{
//$re + - * / 我具体要实现的操作
public function getNum($rs){
switch($rs){
case "+":
return new Numadd();
break;
case "-":
return new NumSub();
break;
case "*":
return new NumMul();
break;
case "/":
return new NumDiv();
break;
}
}
}
var_dump(Fatory::getNum('+')->getVlue(1,2));
?>
#####单例模式
<?php
//单例模式 只能得到一个对象
class Single{
//属性 只能是一个确切的值, 不能是一个运算结果
private $rand;
private $ins = null;
//私有化构造方法 不允许从外部new 对象
private function __construct(){
$this->rand = rand(0, 999);
}
//私有化克隆方法 不允许外部克隆实例
private function __clone(){}
//创建一个静态的公开方法 getIns 返回一个对象实例
static public function getIns(){
//判断是否第一次调用 getIns
if(self::$ins === null){
self::$ins = new self();
}
return self::$ins;
}
}
$s1 = new Single();
$s2 = new Single();
var_dump($s1);
var_dump($s2);
?>
######数据库 例子
<?php
class nConn{
private static $ins = null;
private $conn;
private function __construct(){
$conn = mysqli_connect('localhost', 'root', '123456', 'test');
}
private function __clone(){}
//获取单利模式的对象
static public function getIns(){
if(self::$ins === null){
self::$ins =new self();
}
return self::$ins;
}
public function query($sql){
return mysqli_query($this->com, $sql);
}
}
?>
####2. 结构型的类: #####适配器模式 ######电源接口 例子
<?php
//电源适配器
class Waiguo{
public function test1(){
echo '我是国外的充电接口';
}
}
//设配器
//1. 容纳国外接口
//2. 容纳国内接口
interface Adapter{
public function test1();
public funciton test2();
}
class Adapterr implements Adpter{
private $_name;
//传入国外的电源类名称
public funciton __construct($name){
$this->_name = $name;
}
public function test1(){
//调用 Waiguo类中的test1 方法
return $this->_name->test1();
}
public funciton test2(){
echo '我是国内的充电接口';
}
}
//用户类
class User{
static function UserAdb(){
//获得充电适配器的对象
$user = new Adapterr(new Waiguo());
//国外的电源对象
$user->test1();
$user->test2();
}
}
User::UseAdb();
?>
####3. 行为型的类: #####观察者模式
<?php
interface Flying{
public function fly();
}
class FlyBird implements Flying{
public function fly(){
echo 'i can fly <br>';
}
}
class WarkBird implements Flying{
public function fly(){
echo 'i can`t fly <br>';
}
}
//把变化的从不变化中抽取出来
//把fly 写成一个接口
class Bird{
public function fly($objBird){
return $objBird->fly();
}
public function swim(){
echo 'i can swimming <br>';
}
}
$b1 = new Bird();
$b1->fly(new FlyBird()); //i can fly
?>