博主信息
博文 6
粉丝 3
评论 1
访问量 10147
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
工厂模式应用
齐天大圣的博客
原创
1601人浏览过

要求:计算长方形及三角形的周长与面积

面向过程的写法如下:

class Polygon_old
{
    private $sides = [];

    private $shapes = ['rect', 'triangle'];    // 支持的多边形

    private $shape = '';    // 多边形形状

    public function __construct(string $shape, array $sides)
    {
        if (in_array($shape, $this->shapes)) {
            $this->shape = $shape;
        }

        $this->sides = $sides;
    }

    public function perimeter ()
    {
        switch ($this->shape) {
            case 'rect' :
                $perimeter = ($this->sides[0] + $this->sides[1]) * 2;
                break;
            case 'triangle' :
                $perimeter = $this->sides[0] + $this->sides[1] + $this->sides[2];
                break;
            default:
                throw new \Exception("不支持的图像计算类型");
        }

        return $perimeter;
    }

    public function area ()
    {
        switch ($this->shape) {
            case 'rect' :
                $area = $this->sides[0] * $this->sides[1];
                break;
            case 'triangle' :
                $p = ($this->sides[0] + $this->sides[1] + $this->sides[2]) / 2;
                $area =  sqrt($p * ($p - $this->sides[0]) * ($p-$this->sides[1]) * ($p - $this->sides[2]));
                break;
            default:
                throw new \Exception("不支持的图像计算类型");
        }

        return $area;
    }
}

以上代码会有一些问题

代码耦合度太高,难以维护。所有多边形的周长和面积全都使用一个方法去完成,如果再新增一个计算圆形的周长和面积的话,必须要修改该类。有过经验的应该知道,修改正式环境的代码极易出现问题。

另外,我只要计算圆形的周长和面积。为什么要让和计算圆形无关的代码参与编译。

改进如下

Polygon.php代码如下:

<?php
namespace simplefactory;

class Polygon
{
    private $shape = null;

    public function __construct(string $shape, array $sides)
    {
        $class = '\simplefactory\\' . $shape;

        if (class_exists($class)) {
            /* 基本工厂模式的运用 */
            $this->shape = new $class($sides);
        } else {
            throw new \Exception('不支持的图形计算类型');
        }
    }

    public function perimeter ()
    {
        return $this->shape->perimeter();
    }

    public function area ()
    {
        return $this->shape->area();
    }
}

图形计算的基类Shape.php,代码如下:

<?php

namespace simplefactory;

abstract class Shape
{
    protected $sides = [];

    public function __construct(array $sides)
    {
        $this->sides = $sides;
    }

    abstract public function perimeter ();

    abstract public function area ();
}

计算长方形周长面积类Rect.php,代码如下:

<?php

namespace simplefactory;

class Rect extends Shape
{
    public function perimeter ()
    {
        return ($this->sides[0] + $this->sides[1]) * 2;
    }

    public function area ()
    {
        return $this->sides[0] * $this->sides[1];
    }
}

计算三角形周长面积类Triangle.php,代码如下:

<?php

namespace simplefactory;

class Triangle extends Shape
{
    public function perimeter ()
    {
        return $this->sides[0] + $this->sides[1] + $this->sides[2];
    }

    public function area ()
    {
        $p = ($this->sides[0] + $this->sides[1] + $this->sides[2]) / 2;
        return  sqrt($p * ($p - $this->sides[0]) * ($p-$this->sides[1]) * ($p - $this->sides[2]));
    }
}

常见的工厂模式的应用:在MVC设计中,根据参数来new 出相应控制器

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学