设计模式
思考:有一种需求,希望一个类有且只能有一个对象,这样保证对象的完整性,请问该如何实现呢?
引入:我们将这种一个类最多只能一个对象称为单例,在操作系统中这种方式需求很多,如任务管理器,而通过代码实现这中单例的设计思路我们称为单例模式
单例模式
定义:单例模式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(); ?>