工厂模式

  • 简单工厂模式(Simple Factory)

定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

实例

<?php

class SimpleFactory
{
    public function createBicycle(): Bicycle
    {
        return new Bicycle();
    }
    public function createCar(): Car
    {
        return new Car();
    }
}

class Bicycle
{
    public function driveTo(string $destination)
    {
        var_dump($destination);
    }
}
class Car
{
    public function driveTo(string $destination)
    {
        var_dump($destination);
    }
}

$factory = new SimpleFactory();
$bicycle = $factory->createCar();
$bicycle->driveTo('XiaoMen');
//输出:string(7) "XiaoMen" 
$bicycle = $factory->createBicycle();
$bicycle->driveTo('FuJian');
//输出:string(6) "FuJian"
?>
  • 工厂方法模式 ( Factory Method)

概念

工厂方法模式 和 简单工厂模式非常接近,唯一不同的是,允许有多个工厂存在,相当于给工厂分组。

规则

  1. 每个工厂必须继承一个抽象类或接口类, 使之成为多态。
  2. 每个产品也必须继承一个抽象类或接口类,也使之成为多态。
  3. 每个工厂必须有一个工厂方法返回产品的实例。

实例

<?php
/**
 * 工厂方法。由于简单工厂违背了开发-封闭原则
 * 工厂方法。将这个改变放到了客户端
 * copyright (c) http://blog.csdn.net/CleverCode
 */

// 运算抽象类
class Operation
{  /*{{{*/

    // 数字A
    protected $_numberA = null;

    // 数字B
    protected $_numberB = null;

    /**
     * 设置成员A
     *
     * @param double $num 数字
     * @return void
     */
    public function setNumberA($num){
        $this->_numberA = $num;
    }

    /**
     * 获取成员A
     *
     * @return double 数字
     */
    public function getNumberA(){
        return $this->_numberA;
    }

    /**
     * 设置成员B
     *
     * @param double $num 数字
     * @return void
     */
    public function setNumberB($num){
        $this->_numberB = $num;
    }

    /**
     * 获取成员B
     *
     * @return double 数字
     */
    public function getNumberB(){
        return $this->_numberA;
    }

    /**
     * 获取运算结果
     *
     * @return double 数字
     */
    public function getResult(){
        return null;
    }
}  /*}}}*/

// 加法类
class OperationAdd extends Operation
{  /*{{{*/

    /**
     * 获取运算结果
     *
     * @return double 数字
     */
    public function getResult(){
        return $this->_numberA + $this->_numberB;
    }
}  /*}}}*/

// 减法类
class OperationSub extends Operation
{  /*{{{*/

    /**
     * 获取运算结果
     *
     * @return double 数字
     */
    public function getResult(){
        return $this->_numberA - $this->_numberB;
    }
}  /*}}}*/

//运算工厂
interface IFactory
{/*{{{*/
    public function createOperate();
}/*}}}*/

//加法工厂
class AddFactory implements IFactory
{/*{{{*/

    public function createOperate()
    {
        return new  OperationAdd();
    }
}/*}}}*/

//减法工厂
class SubFactory implements IFactory
{/*{{{*/
    public function createOperate()
    {
        return new OperationSub();
    }
}/*}}}*/

class Client
{/*{{{*/
    public static function main($a, $b)
    {
        //简单工厂的switch case 放到了客户端了
        $factory = new AddFactory();
        $add = $factory->createOperate();
        // 设置数字A
        $add->setNumberA($a);

        // 设置数字B
        $add->setNumberB($b);

        // 运算
        echo $add->getResult()."\r\n";
    }
}/*}}}*/

Client::main(5,3);
//输出:8
?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,416评论 0 7
  • 工厂模式概述 意义 问题引出在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用...
    stoneyang94阅读 557评论 0 0
  • 1.接口基础回顾 设计模式六大原则,其中依赖倒转原则,强调我们应该面向接口编程,那什么是接口?接口的作用? 接口如...
    孟婆汤不解渴阅读 914评论 0 3
  • 该文章属于刘小壮原创,转载请注明:刘小壮[https://www.jianshu.com/u/2de707c93d...
    刘小壮阅读 13,076评论 29 59
  • 最近的自己,有点迷茫,有点彷徨,我感觉自己好像在大学的路上迷路了。虽然才刚刚大一一年,应该说,大学的美好时光...
    加油君12138阅读 356评论 0 0

友情链接更多精彩内容