借鉴于GIT知识分享
用工厂方法或者类来实例化对象,而不是直接new。
首先我们需要创建一个工厂类,比如Factory.php。如果不使用工厂模式的,我们需要一个对象的时候通常需要
new Inexistence\girlfriend();
然而我们一般不只在一个地方需要这个对象,这个时候一旦对象发生变更,或者对象的某些属性发生变化,我们就需要一个一个的来改,非常麻烦。这个时候我们引入工厂类,在Factory.php中
<?php
namespace Imagination;
class Factory
{
static function getGirlfriend()
{
$GF = new girlfriend;
return $GF;
}
}
然后每次调用时$GF1 = Imagination\Factory::getGirlfriend()就可以避免四处修改的问题。
在Laravel中这样的设计模式很常见。
class CommentsController extends Controller {
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store()
{
if (Comment::create(Input::all())) {
return Redirect::back();
} else {
return Redirect::back()->withInput()->withErrors('Fail to comment!');
}
}
}
这段工厂模式描述的比较简单,找到了laravel学院的一片文章 和 GIT 的一篇英文文章。
学院君的举例可以很快的理解。如下:
出现的问题
举个例子,如果某个应用是可移植的,那么它需要封装平台依赖,这些平台可能包括窗口系统、操作系统、数据库等等。这种封装如果未经设计,通常代码会包含多个 if 条件语句以及对应平台的操作。这种硬编码不仅可读性差,而且扩展性也不好。
解决的思路
提供一个间接的层(即“抽象工厂”)抽象一组相关或依赖对象的创建而不是直接指定具体实现类。该“工厂”对象的职责是为不同平台提供创建服务。客户端不需要直接创建平台对象,而是让工厂去做这件事。
这种机制让替换平台变得简单,因为抽象工厂的具体实现类只有在实例化的时候才出现,如果要替换的话只需要在实例化的时候指定具体实现类即可。
学院君图解
GIT分析图解
laravel学院的这个工程模式有一些没看懂,关于PHPUnit 的一些函数 assertContainsOnly(),还有就是 phpunit 根据这个标志 @dataProvider getFactories,获取getFactories方法返回的数据分别传入该方测试方法中调试。是不是固定写法。