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

本文详细介绍了工厂设计模式,包括简单工厂模式和参数化工厂方法的设计原理与实现方式,并提供了PHP代码示例,展示了如何通过工厂模式方便地扩展新产品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

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

简单工厂模式类图

这里写图片描述

简单的例子

参与者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()接口保持不变,在工厂方法设计中做任何改变或增补都不会导致破坏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值