每天给你分享一个PHP基础知识点,希望能帮助到你,花5分钟时间看看。或许你早就知道如何用工厂设计模式,或许对你有些许帮助,可是最后还是感谢你的关注
巩固php基础工厂设计模式,免费分享给你视频教程【PHP各种设计模式视频教程】,公众号里回复: 免费领取提取码!
设计模式,是每个程序员必须知道,必须学习的知识,虽然不算是基础,但是你必须要懂得。
我这里所了解的大概有23种设计模式,PHP常见的大概有10几种吧。
总体来说设计模式分为三大类:
创建型模式共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
工厂模式( )作为一种创建型设计模式, 遵循了开放-封闭原则, 对修改封闭, 对扩展开放. 工厂方法( )模式就是要创建"某种东西".
对于工厂方法模式, 要创建的"东西"是一个产品,这个产品与创建它的类之间不存在绑定.实际上,为了保持这种松耦合,客户会通过一个工厂发出请求. 再由工厂创建所请求的产品.也可以换种方式考虑, 利用工厂方法模式, 请求者只发出请求, 而不具体创建产品.
工厂的工作
先建立一个工厂的接口
.php
<?php
abstract class Factory
{
//抽象的创建对象的方法
protected abstract function createProduct();
//该方法调用createProduct方法返回一个产品对象.
public function start()
{
return $this->createProduct();
}
}
start方法返回一个产品,该方法调用方法完成产生产品的操作.所以的具体实现要构建并返回一个按接口实现的产品对象.
比如产品都有一个共同的方法(), 以下是对应接口
.php
<?php
//产品接口
interface Product
{
public function getProperties();
}
接着, 我们要建立两个工厂,文本工厂和图像工厂
.php
<?php
include_once('Factory.php');
include_once('TextProduct.php');
class TextFactory extends Factory
{
protected function createProduct()
{
$product = new TextProduct();
return $product->getProperties();
}
}
.php
<?php
include_once('Factory.php');
include_once('PhotoProduct.php');
class PhotoFactory extends Factory
{
protected function createProduct()
{
$product = new PhotoProduct();
return $product->getProperties();
}
}
可以看到,在工厂方法的实现中, 方法引入了多态(), 将用这个方法返回"文本"或"图像". 同一个()有多个(poly)不同的形态(), 这就是多态.在这种情况下, 其中一种形式返回文本, 而另一种返回图像.
可以在这个实现中放入你想要的任何东西,工厂方法设计将会创建这个对象, 并把他返回给使用.
下面的是两个产品的实现
.php
<?php
include_once('Product.php');
class TextProduct implements Product
{
public function getProperties()
{
return "这里是文本产品";
}
}
.php
<?php
include_once('Product.php');
class PhotoProduct implements Product
{
//这是产品具有的方法
public function getProperties()
{
return "这里是图像产品";
}
}
这两个产品实现了接口中的抽象方法(),
客户()
我们并不希望客户直接做出产品请求.实际上, 我们希望客户通过工厂接口做出请求.这样一来,如果以后我们增加了产品或者工厂, 客户可以做同样的请求来得到更多类型的产品 , 而不会破坏这个应用:
.php
<?php
include_once('PhotoFactory.php');
include_once('TextFactory.php');
class Client
{
public function __construct()
{
$this->somePhotoObject = new PhotoFactory();
echo $this->somePhotoObject->start() . '
';
$this->someTextObject = new TextFactory();
echo $this->someTextObject->start() . '
';
}
}
$worker = new Client();
运行.php, 得到下面的结果
这里是图像产品
这里是文本产品
注意:对象并没有向产品直接做出请求, 而是通过工厂来请求. 重要的是, 客户并不实现产品特性, 而留给产品实现来体现.
调整产品
设计模式的真正价值并不是提高操作的速度, 而是加快开发的速度.
如果现在需求变化了, 需要对图像产品做出修改, 只需要修改相应的产品的方法即可
对象的改变看起来很简单 不过的()方法仍保持相同的接口,请求工厂返回一个属性对象
增加新产品和参数化请求
问题来了,如果要增加更多的图像和文本说明, 有没有必要每次增加一个新的区域就增加一个新的具体的工厂类?这意味着要为每个新区域增加一个新工厂和产品.于是,我们引进了参数化工厂设计模式
参数化工厂设计模式和一般的工厂设计模式的主要区别之一是客户包含工厂和产品的引用. 在参数化请求中, 类必须指定产品, 而不是产品工厂.()操作中的参数是由客户传入一个产品; 所以客户必须指出它想要的具体产品. 不过, 这个请求仍然是通过工厂接口发出的. 所以, 尽管客户包含一个产品引用, 但通过, 客户仍然与产品分离.
一个工厂多个产品(参数化工厂方法)
对于大多数请求, 参数化工厂方法更为简单, 因为客户只需要处理一个具体工厂.工厂方法操作有一个参数,指示需要创建的产品.而在原来的设计中, 每个产品都有自己的工厂, 不需要另个传递参数; 产品实现依赖于各个产品特定的工厂.
新工厂接口
.php
<?php
abstract class Factory
{
//抽象的创建对象的方法
protected abstract function createProduct(Product $product);
//该方法由factoryMethod方法返回一个产品对象.
public function start($product)
{
return $this->createProduct($product);
}
}
在这个新的接口中可以看到,()和start()都需要一个参数,指定一个对象, 而不是接口的一个特定实现, 所以可以接受任何的具体实例.
工厂具体实现
具体的创建者类实现了(),如下
.php
<?php
include_once('Factory.php');
include_once('Product.php');
class CommonFactory extends Factory
{
protected function createProduct(Product $product)
{
return $product->getProperties();
}
}
这个类调用的方法将产品返回给客户.
新产品
具体产品的变化并不会改变原来的接口,还是原来的代码
<?php
//产品接口
interface Product
{
public function getProperties();
}
例如, 现在有一个钢笔产品
.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自学中心
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh