对于大多数请求, 参数化工厂方法更为简单, 因为客户只需要处理一个具体工厂.工厂方法操作有一个参数,指示需要创建的产品.而在原来的设计中, 每个产品都有自己的工厂, 不需要另个传递参数; 产品实现依赖于各个产品特定的工厂.
新工厂接口
Factory.php
<?php abstract class Factory { //抽象的创建对象的方法 protected abstract function createProduct(Product $product); //该方法由factoryMethod方法返回一个产品对象. public function start($product) { return $this->createProduct($product); } }
在这个新的Factory接口中可以看到, create()和start()都需要一个参数,指定一个Product对象, 而不是Product接口的一个特定实现, 所以可以接受任何Product的具体实例.
工厂具体实现
具体的创建者类CommonFactory实现了createProduct(),如下
CommonFactory.php
<?php include_once('Factory.php'); include_once('Product.php'); class CommonFactory extends Factory { protected function createProduct(Product $product) { return $product->getProperties(); } }
这个类调用Product的方法getProperties将产品返回给客户.
新产品
具体产品的变化并不会改变原来的Product接口,还是原来的代码
<?php //产品接口 interface Product { public function getProperties(); }
例如, 现在有一个钢笔产品PenProduct
PenProduct.php
<?php include_once('Product.php'); class PenProduct implements Product { public function getProperties() { return "钢笔产品"; } }
客户Clent(有参数)
<?php include_once('CommonFactory.php'); include_once('PenProduct.php'); class Client { public function __construct() { $commonFactory = new CommonFactory(); echo $commonFactory->start(new PenProduct()); } } $worker = new Client();
运行后输出
钢笔产品
以后如果开发出了新的产品, 只需要创建对应的产品类, 然后客户指定想要的新产品 , 即可返回客户需要的产品.
总结:
产品改变: 接口不变
使用设计模式的一大好处就是可以很容易地对类做出改变, 而不会破坏更大的程序. 之所以能够容易地做出改变, 秘诀在于保持接口不变, 而只改变内容.
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》