【Laravel 设计模式-----------工厂模式】

借鉴于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分析图解
GIT分析图解

laravel学院的这个工程模式有一些没看懂,关于PHPUnit 的一些函数 assertContainsOnly(),还有就是 phpunit 根据这个标志 @dataProvider getFactories,获取getFactories方法返回的数据分别传入该方测试方法中调试。是不是固定写法。

猜你喜欢

转载自blog.csdn.net/cuiliwu/article/details/80527904
今日推荐