您现在的位置是:网站首页 > 心得笔记

常用设计模式之工厂

盛悦2025-02-2185人围观
简介本文将记录常用设计模式之工厂

工厂模式定义

工厂模式作为一种创建型设计模式,遵循了开放-封闭原则,对扩展开放对修改封闭。工厂方法模式就是要创建某种东西。
对于工厂模式,要创建的东西是一个产产品,这个产品与创建它的类之间不存在绑定。生产产品的过程=客户通过工厂发出请求+再由工厂创建
所请求的产品。即请求者只向工厂发出请求,并不具体创建产品。

工厂的工作

  1. 先建立一个工厂的接口

   Factory.php

abstract class Factory
{
    //抽象的创建对象的方法
    protected abstract function createProduct();
    
    //该方法调用createProduct方法返回一个产品对象.
     public function start()
     {
       return $this->createProduct();
     }
}
start方法返回一个产品,该方法调用createProduct方法完成产生产品的操作.所以createProduct的具体实现要构建并返回一个按Product接口实现的产品对象.

比如产品都有一个共同的方法getProperties(), 以下是对应Product接口

product.php

<?php
//产品接口
interface Product
{
 public function getProperties();
}


2.接着,我们要建立两个工厂,文本工厂TextFactory和图像工厂phptoFactory

TextFactory.php

<?php
include_once('Factory.php');
include_once('TextProduct.php');
class TextFactory extends Factory
{
 protected function createProduct()
 {
  $product = new TextProduct();
  return $product->getProperties();
 }
}

PhotoFactory.php

<?php
include_once('Factory.php');
include_once('PhotoProduct.php');
class PhotoFactory extends Factory
{
 protected function createProduct()
 {
  $product = new PhotoProduct();
  return $product->getProperties();
 }
}

可以看到,在工厂方法的实现中, getProperties方法引入了多态, 将用这个方法返回"文本"或"图像". 同一个getProperties()有多个不同的形态, 这就是多态.在这种情况下, 其中一种形式返回文本, 而另一种返回图像.

可以在properties这个实现中放入你想要的任何东西,工厂方法设计将会创建这个对象, 并把他返回给Client使用.


3.下面是两个产品的实现

TextProduct.php

<?php
include_once('Product.php');
class TextProduct implements Product
{
 public function getProperties()
 {
  return "这里是文本产品";
 }
}

PhotoProduct.php

<?php
include_once('Product.php');
class PhotoProduct implements Product
{
 //这是产品具有的方法
 public function getProperties()
 {
  return "这里是图像产品";
 }
}

这两个产品实现了Product接口中的抽象方法getProperties(),


4.客户请求

我们并不希望客户直接做出产品请求.实际上, 我们希望客户通过Factory工厂接口做出请求.这样一来,如果以后我们增加了产品或者工厂, 客户可以做同样的请求来得到更多类型的产品 , 而不会破坏这个应用:

Client.php

<?php
include_once('PhotoFactory.php');
include_once('TextFactory.php');
class Client
{
 public function __construct()
 {
  $this->somePhotoObject = new PhotoFactory();
  echo $this->somePhotoObject->start() . '<br />';
  $this->someTextObject = new TextFactory();
  echo $this->someTextObject->start() . '<br />';
 }
}
$worker = new Client();
运行Client.php, 得到下面的结果
这里是图像产品
这里是文本产品

注意: Client对象并没有向产品直接做出请求, 而是通过工厂来请求. 重要的是, 客户并不实现产品特性, 而留给产品实现来体现.


工厂模式的大体架构形象化比作生活中的一个例子。客户想要定制饮料,①客户直接去饮料总工厂预定②饮料总工厂接单后分别分给各子饮料工厂,比如用户要二百箱红牛,二百箱可乐,二百箱雪碧。③红牛可乐雪碧子公司接到任务后开始启动同一款机器,比如畅饮机器,生产指定的饮料。

总饮料工厂需要有这几个要素

①抽象工厂类

YinliaoFactory.php

abstract class YinliaoFactory
{
    //抽象的创建对象的方法
    protected abstract function createProduct();
    
    //该方法调用createProduct方法返回一个产品对象.
     public function start()
     {
       return $this->createProduct();
     }
}

各子工厂需要有这几个要素

①生产饮料的接口

yinliaoProduct.php

<?php
interface yinliaoProduct
{
 public function product();
}

②实现生产饮料接口的类

<?php
HongniuProduct.php

include_once('yinliaoProduct.php');
class HongniuProduct implements yinliaoProduct
{
 public function product()
 {
  return "开始生产红牛";
 }
}

③继承总工厂的红牛子工厂类

HongniuFactory.php

<?php
include_once('YinliaoFactory.php');
include_once('yinliaoProduct.php');
class HongniuFactory extends YinliaoFactory
{
 protected function createProduct()
 {
  $product = new yinliaoProduct();
  return $product->product();
 }
}