php设计模式之参数化工厂
本文介绍的参数化工厂模式,也是属于工厂模式。前面已经介绍了简单工厂、工厂方法
在工厂方法里面,我们可以看出,如果我想去调用一个手机的生成方法,这样我就要去新建一个手机工厂和一个手机产品类,那如果添加的产品很多的时候,我们就需要新建大量的产品类和工厂类。那么怎么解决这个问题呢?于是就引入了参数工厂模式。
参数工厂模式,我们只要维护一个工厂,这一个工厂可以维护N个产品,当用户访问的时候,只要告诉这个工厂需要什么样的产品,工厂根据产品去给相应的结果。这样就没必要维护多个工厂的麻烦了。
Creator.php,工厂抽象基类
1 <?php 2 //工厂基类 3 abstract class Creator 4 { 5 6 protected abstract function fatoryMethod( Product $product ); 7 8 public function startFactory( Product $product ) 9 { 10 $mfg = $this->fatoryMethod( $product ); 11 return $mfg; 12 } 13 }
由代码可见,需要实例化的fatoryMethod,需要传入Product类型的实例。唯一的工厂方法,ProductFactory.php
1 <?php 2 //制造产品的工厂 3 include_once("Creator.php"); 4 5 class ProductFactory extends Creator 6 { 7 8 protected function fatoryMethod( product $product ) 9 { 10 return $product->getProperties(); 11 } 12 }
该工厂的fatoryMethod,拿到产品的实例化对象之后,直接去调用该商品的getProperties
产品接口,product.php
1 <?php 2 //产品接口 3 interface Product 4 { 5 public function getProperties(); 6 }
下面是我需要的个产品,Apple.php
1 <?php 2 //苹果产品 3 include_once('Product.php'); 4 5 class Apple implements Product 6 { 7 8 public function getProperties() 9 { 10 return "making Apple"; 11 } 12 }
客户端访问的类,Client.php
1 <?php 2 //客户端 3 include_once('ProductFactory.php'); 4 include_once("Apple.php"); 5 6 class Client 7 { 8 9 public function __construct() 10 { 11 $fobj = new ProductFactory(); 12 echo $fobj->startFactory( new Apple() ) . "<br/>"; 13 } 14 } 15 16 new Client();
这样的话,客户端,client访问的时候,只需要给方法传入我的产品,这样通用的工厂就会自动调用这个产品的getProperties。从而实现了,一个工厂管理N个产品。这是如果我们新添加一个产品,Pencil.php的话,我们只需要新建一个Pencil.php的产品类
1 <?php 2 //铅笔产品 3 include_once('Product.php'); 4 5 class Pencil implements Product 6 { 7 8 public function getProperties() 9 { 10 return "making Pencil"; 11 } 12 }
这样我们在访问的时候,想获取铅笔产品的话,这样修改Client即可:
1 <?php 2 //客户端 3 include_once('ProductFactory.php'); 4 //include_once("Apple.php"); 5 include_once("Pencil.php"); 6 7 class Client 8 { 9 10 public function __construct() 11 { 12 $fobj = new ProductFactory(); 13 //echo $fobj->startFactory( new Apple() ) . "<br/>"; 14 echo $fobj->startFactory( new Pencil() ) . "<br/>"; 15 } 16 } 17 18 new Client();
声明:本文内容仅是本人学习的记录,不保证在项目中可用,若引用此代码导致了严重后果,本人不承担任何法律责任。