php设计模式——工厂方法设计模式

来源:互联网 发布:淘宝主图尺寸怎么调整 编辑:程序博客网 时间:2024/06/16 06:27

概述

工厂设计模式作为一种创建型设计模式,即是创建某个产品。创建它的类向工厂发送请求,具体创建则由工厂来完成,由此达到产品与创建它的类松耦合的目的

简单工厂模式类图

这里写图片描述

简单的例子

参与者Creator类代码实例:

<?php     abstract class Creator     {         protected abstract factoryMethod();         public function startFactory()         {             $p = $this->factoryMethod();             return $p;         }     } ?>

具体工厂类实现代码:

<?php    include_once('Creator.php');    include_once('CatProduct.php');    class CatFactory extends Creator    {        protected function factoryMethod()        {            $product = new CatProduct();            return ($product->getProperties());        }    } ?>
<?php    include_once('Creator.php');    include_once('DogProduct.php');    class DogFactory extends Creator    {        protected function factoryMethod()        {            $product = new CatProduct();            return ($product->getProperties());        }    } ?>

Product类具体实现:

<?php    interface Product    {        public function getProperties();    } ?>

具体产品类实现代码:

<?php    include_once('Product.php');    class DogProduct implements Product    {        private  $mfgProduct;        public function getProperties()        {            $this->mfgProduct = 'dog';            return $this->mfgProduct;        }    }?>
<?php    include_once('Product.php');    class CatProduct implements Product    {        private  $mfgProduct;        public function getProperties()        {            $this->mfgProduct = 'cat';            return $this->mfgProduct;        }    }?>

客户端client具体实现代码

<?php    include_once('CatFactory.php'):    include_once('DogFactory.php'):    class Client    {        private catObject;        private dogObject;        public function _construct()        {            $this->catObject = new CatFactory()            echo $this->catObject->startFactory();            $this->dogObject = new DogFactory()            echo $this->dogObject->startFactory();                 }    }    $worker = new Client();?>

如上所述的简单工厂工厂模式中,一个工厂对应一个产品,若我需要建立新的产品,那么相应的工厂也需要增加,那么有什么办法只需一个工厂可以生产多个产品呢?答案是有的,那就是参数化工厂方法
这里写图片描述

参数化工厂设计实例

Creator代码示例

<?php     abstract class Creator     {         protected abstract factoryMethod(Product $product);         public function doFactory($productNow)         {             $p = $this->factoryMethod($productNow);             return $p;         }     } ?>

ConcreteFactory工厂类代码

<?php    include_once('Creator.php');    include_once('Product.php');    class ConcreteFactory extends Creator    {        private $p;        protected function factoryMethod(Product $product)        {            $p = $product;            return ($this->$p->getProperties());        }    } ?>

Product类具体实现:

<?php    interface Product    {        public function getProperties();    } ?>

具体产品类实现代码:

<?php    include_once('Product.php');    class DogProduct implements Product    {        private  $mfgProduct;        public function getProperties()        {            $this->mfgProduct = 'dog';            return $this->mfgProduct;        }    }?>
<?php    include_once('Product.php');    class CatProduct implements Product    {        private  $mfgProduct;        public function getProperties()        {            $this->mfgProduct = 'cat';            return $this->mfgProduct;        }    }?>

有参数客户端client具体实现代码

<?php    include_once('CatProduct.php'):    include_once('DogProduct.php'):    include_once('ConcreteFactory.php'):    class Client    {        private factory;        public function _construct()        {            $this->factory= new ConcreteFactory();            echo $this->factory->doFactory(new DogProduct());            echo $this->factory->doFactory(new CatProduct());              }    }    $worker = new Client();?>

利用工厂模式,可以很方便的扩展新的产品,如示例代码:只要Product的getProperties()接口保持不变,在工厂方法设计中做任何改变或增补都不会导致破坏

原创粉丝点击