单例模式和工厂模式

<?php

/***
*单例模式
*使用场景:
*1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
* 
***/
//创建一个 Singleton 类
//1、懒汉式,线程不安全  多线程不能正常工作
class SingleObject 
{

   //创建 SingleObject 的一个对象
   private static  $instance =null;

   //让构造函数为 private,这样该类就不会被实例化
   private function __construct()
   {
     # code...
   }

   //获取唯一可用的对象
   public static function getInstance()
   {
      if(self::$instance === null)
          self::$instance = new SingleObject();
      return self::$instance;
   }

   public function showMessage()
   {
      echo "Hello World!";
   }
}

$object = SingleObject::getInstance();

$object->showMessage();
exit;
/**
 *  工厂模式
 * 使用场景:
 * N多个地方用到 user  如有更改 只需要改动工厂
 * 假设您需要先创建对象,然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴。
 */
interface IUser
{
  function getName();
}
 
class User implements IUser
{
  public static function Load( $id ) 
  {
        return new User( $id );
  }
 
  public static function Create( ) 
  {
        return new User( null );
  }
 
  public function __construct( $id ) { }
 
  public function getName()
  {
    return "Jack";
  }
}
 
$uo = User::Load( 1 );
echo( $uo->getName()."\n" );


interface IUser
{
  function getName();
}
 
class User implements IUser
{
  public $name = 123;
  public function __construct( $id ) { }//少量属性可以在这里设置
 
  public function getName()
  {
    return $this->name;
  }
  public function setUserName($name)
  {
     $this->name = $name;
  }
}
 
class UserFactory
{
  public static function Create( $id )
  {
    $a = new User( $id );
    $a->setUserName('abc');
    return $a;
  }
}
 
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );


exit;

 

posted on 2018-03-30 16:04  小乔流水人家  阅读(180)  评论(0)    收藏  举报

导航