PHP设计模式–工厂模式

工厂模式就是创建“某种东西”。对于工厂模式,要创建的是一个“产品”,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建请求的产品。

何时使用工厂方法

如果一个类要创建的对象数目固定,而且已知,name构建这个类时,就可以采用一种可以预测的方式创建制定数目的对象。例如,如果你要开发一个世界的地图应用,由不同的对象表示七大洲,可以肯定的是,这些对象不会改变。另一方面,如果你要为不同种类的昆虫创建一个网站,肯定会不断发现新的昆虫,或者有些昆虫会有改变,还有可能某些品种会在短时间内灭绝。要处理这种变化,程序必须充分的灵活性。这种项目就可以考虑使用工厂模式。

优势

我感觉工厂模式的最大优势在于封装,把对象相互隔离,没有影响。

最简单的例子

工厂

第一步是建立工厂。我们使用一个抽象类Creator作为接口。

<?php
// Creator
abstract class Creator {

    protected abstract function factoryMethod();

    public function startFactory() {
        $mfg  = $this->factoryMethod();
        return $mfg;
    }
}

第二步是集成实现这个接口。我使用了两个子类来实现接口的方法。

<?php
//TextFactory.php
include_once 'Creator.php';
include_once 'TextProduct.php';

class TextFactory extends Creator {

    protected function factoryMethod() {
        $product = new TextProduct();
        return $product->getProperties();
    }

}
<?php
// GraphicFactory
include_once 'Creator.php';
include_once 'GraphicProduct.php';

class GraphicFactory extends Creator {

    protected function factoryMethod() {
        $product = new GraphicProduct();
        return $product->getProperties();
    }
}

产品

工厂模式的第二个接口就是产品,其实“产品”这个含义是相对于“工厂”的概念,并不一定是实实在在的产品,比如,我们可以把人当初产品等等。

<?php
interface Product {
    public function getProperties();
}

同样的,我们再使用两个子类分别继承实现Product的属性。这里有两个“产品”,分别是 图像 和 文字,但是两个“产品”的属性是不一样的。

<?php
//GraphicProduct
include_once 'Product.php';
class GraphicProduct implements Product {

    private $mfgProduct;

    public function getProperties() {
        $this->mfgProduct = "This is a graphic.";
        return $this->mfgProduct;
    }

}
<?php
// TextProduct
include_once 'Product.php';
class TextProduct implements Product {

    private $mfgProduct;

    public function getProperties() {
        $this->mfgProduct = "This is a text .";
        return $this->mfgProduct;
    }
}

客户

客户就是指代码运行结果的显示终端,也就是所说的客户端了

<?php
include_once 'GraphicFactory.php';
include_once 'TextFactory.php';

class Client {
    private $someGraphicObject;
    private $someTextObject;

    public function __construct() {
        $this->someGraphicObject = new GraphicFactory();
        echo $this->someGraphicObject->startFactory() . "\n";
        $this->someTextProduct = new TextFactory();
        echo $this->someTextProduct->startFactory() . "\n";
    }

}
$worker = new Client();

代码运行

feilongdeMBP:Factory feilong$ php Client.php
This is a graphic.
This is a text

参考资料

  • Learning PHP设计模式

附件

使用docker搭建lnmp (二)

docker 名为容器。何为容器,也就是所谓的瓶子,罐子。用可以容纳东西的容器,不同容器之间互不影响。比如,一个瓶子装酒精,一个瓶子装水,非人为状态下,两个瓶子是没有关联的。

同样,docker也就是这个作用,每个docker可以作为叫做一个“瓶子”,每个”瓶子”可以当做PHP的运行环境,可以当做Java的运行环境。环境完全独立。外部的环境(内存,操作系统,CPU等)相当于柜子,承载着这些”瓶子”。

Read More »

使用docker搭建lnmp环境

docker是一个开源的容器引擎,随着“微服务架构”正在变得越来越重要,docker也变得越来越火。但是网上的文章中,要么是很有借鉴意义的干货,要么就是使用高端术语来讲述什么叫做微服务架构。今天我就通过文章来记述一下传统lnmp迁移docker的过程。

Read More »

PHP源码分析之cli模式执行的过程

众所周知,PHP在web上应用很广泛。接近80%的web网站都是使用PHP+MySQL,虽然越来越多的新语种崛起,但是现在PHP依然是中小型web系统的首选。PHP除了在web上有很多应用,也经常被用作脚本工具,虽然没有原生shell效率高,但是起点比较低。今天就和大家分享下PHP cli模式的执行过程。

Read More »

Git SSH和HTTPS互相切换

Git SSH和HTTPS互相切换

先前使用git clone到本地的项目,有一次提交的时候,莫名有个文件不能push了,错误提示是没有权限,也没找到具体的原因,后来想到一个办法,就是切换方式,例如,我是通过SSH clone项目的,能不能通过HTTPS提交呢?查了下资料,发现 git remote 可以实现

Read More »