+ -
当前位置:首页 → 问答吧 → 设计模式学习笔记——工厂模式

设计模式学习笔记——工厂模式

时间:2011-10-02

来源:互联网

看到的对工厂模式的一段生动的描述,转述一下:

      追女孩子难免不了要请女孩子吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是大多女孩子的最爱,虽然口味有所不同,但是无论是到麦当劳还是肯德基,只要向服务员说“来四个鸡翅”就可以了。——麦当劳和肯德基就是生产鸡翅的工厂。

  工厂模式:客户类与工厂类分离。消费者需要某种产品,直接向工厂请求即可。消费者无需修改就可以获得新产品。
  刚才那段描述中,麦当劳和肯德基就属于工厂类,鸡翅就是产品类。
  缺点:产品类作出修改时,可能工厂类也需要相应的修改。


  PHP代码示例:

<?php

/*工厂模式 接口部分*/
interface abstracted
{
     public function realCreate();
}

/*女孩类*/
class girl
{
     public function action()
     {
         echo "女孩很漂亮";
     }
}

/*男孩类*/
class boy
{
     public function action()
     {
          echo "男孩很好强";
     }
}

/*制造女孩*/
class GirlCreator implements abstracted
{
      public $chromosome;  //染色体
      public function realCreate()
      {
           if($this->chromosome=='xx')
           {
                return new girl();
           }
      }
}

/*制造男孩*/
class BoyCreator implements abstracted
{
     public $chromosome;
     public function realCreate()
     {
          if($this->chromosome=='xy' || $this->chromosome=='xyy')
          {
               return new boy();
          }
     }
}

/*人类工厂*/
class PersonFactory
{   
     public function create($what)
     {
          $create=$what.'Creator';
          $create=new $create();
          return $create;
     }
}
$create=new PersonFactory();
$instance=$create->create('Girl');
$instance->chromosome='xx';
$instance->realCreate()->action();

?>

作者: 星汉   发布时间: 2011-10-02

代码示例二:

<?php

interface Iuser
{
      function getName();
}

class User implements Iuser
{
      public function _construct($id)
     {

      }
      public function getName()
      {
            return 'jack';
      }
}

class UserFactory
{
      public static function create($id)
      {
            return new User($id);
      }
}

$uo=UserFactory::create(1);
echo $uo->getName().'</br>';

?>

作者: 星汉   发布时间: 2011-10-02

有一种工厂模式的变体使用工厂方法。类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要,此方法非常有用。比如需要先创建对象,然后设置许多属性。这种版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也无须将复制好的代码在代码库中到处粘贴。

显示使用工厂方法的PHP代码示例:
<?php
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 static function _construct($id)
     {
          ;
     }
     public function getName()
     {
          return 'jack';
     }
}
$uo=User::Load(1);
echo $uo->getName().'</br>';
?>

作者: 星汉   发布时间: 2011-10-02