设计模式

思考:有一种需求,希望一个类有且只能有一个对象,这样保证对象的完整性,请问该如何实现呢?

引入:我们将这种一个类最多只能一个对象称为单例,在操作系统中这种方式需求很多,如任务管理器,而通过代码实现这中单例的设计思路我们称为单例模式

单例模式

定义:单例模式singleeton,是一种类的设计只会最多产生一个对象的设计思想

<?php

class singglelon{

    //设置属性来保存对象
    private static $object=null;
    //构造方法系优化  不允许在外部实例化
    private  function __construct(){
        echo __METHOD__;
    }

    public static function getinfo(){
        // 判断对象   instanceof 是判断一个对象是否属于这个类的 或者子类
        // 当前保存的object 不是singglelon对象
        if(!self::$object instanceof self){
            // 产生对象
            self::$object=new self;
           
        }
        // 返回对象
        return self::$object;
    }

}

$s1=singglelon::getinfo();   //返回同一个对象
var_dump($s1);

$s2=singglelon::getinfo();   //返回的是同一个对象
var_dump($s2);
?>

以上方法可以保证无论多少次调用共有静态方法获取实例,都会只能得到一个对象,但是此时外部对象依然可以产生新的对象,因为克隆,所以还必须禁止对象的克隆

即在类内部私有化克隆方法。

    private function __clone(){

    }
$s3 =clone $s2;     //克隆报错
var_dump($s3);

总结

  1.单例模式就是设计的类最多只能得到一个对象

  2.私有化构造方法,禁止在类外无限实例化对象

  3.私有化克隆方法,禁止对象无线克隆对象

  4.私有化静态属性,保存类内部实例化得到的对象

  5.公有化静态方法,允许外部通过调用类内部方法获取对象

  单例模式如果还有其他功能诉求,可以在类中增加相应的其他类成员

  单例模式的目的是为了保护资源唯一性。

思考:一个类可能在多个地方需要实例化,如数据库,每次操作数据库都要实例化,如果 类名修改,那是不是有很多地方海马要改?

引入:因为类在实例化对象的时候是new类名实现,所以如果出现类名的修改,那么所有的newv操作的确都需要重新修改代码。如果有一种方式,可以子某个

地方实现所有的实例化,那么修改就会变得简单,这个就需要工厂模式了

工厂模式

定义:工厂模式factory,是指像流水线生产对象,有一个地方生产对象,其他位置就不需要额外实例化对象,从而方便后期代码通过一维护。而且工厂模式可以方便隐藏真实的类结构

,因此也更加安全。

<?php


// 男人类
class man{
    
    public static function show(){
        echo '我是男人';
    }
}




// 女人类
class wman{
    public static function show(){
        echo '我是女人';
    }
}



// 工厂类
class factory{

    // 同意实例化 生产对象
    public static function  get_instance($class){
        switch($class){
            case 'm';
                return new man();
            case 'w';
                return new wman();
            default;
                return null;
        }
    }
}


$s1= factory::get_instance('w');
$s1->show();
?>
原文地址:https://www.cnblogs.com/xiaowie/p/12241049.html