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();

 

posted @ 2016-11-23 16:10  NickBai  阅读(411)  评论(0编辑  收藏  举报