目录
PHP设计模式——简单工厂
首页 php教程 php手册 PHP设计模式简单工厂

PHP设计模式简单工厂

Jun 13, 2016 am 09:07 AM
工厂 设计模式

PHP设计模式——简单工厂

 

前面两节内容介绍了什么是设计模式以及六大原则,相信看完前两节内容大家对设计模式已经有了初步的认识,接下来说一下设计模式的分类。

 

一般将面向对象设计模式分为三类:创建型、结构型、行为型三种。

 

创建型:创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式、单例模式、生成器模式、原型模式。

 

结构型:用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式、桥接模式、组合器模式、装饰器模式、门面模式、亨元模式和代理模式。

 

行为型:用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式、访问者模式和职责链模式。

 

今天主要介绍创建型的第一种简单工厂模式。

注意:在阅读本系列博客的时候一定要有阅读UML类图、面向对象PHP编程基础。

 

 

简单工厂模式不属于23种常用面向对象设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。其实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

 

角色及职责:

工厂(SimpleFactory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

需求:根据提供相应的属性值由简单工厂创建具有相应特性的产品对象。

现根据以上UML类图编写如下PHP代码。

 

<!--?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/4/9
 * Time: 21:48
 */

/**抽象产品角色
 * Interface IProduct   产品接口
 */
interface IProduct
{
    /**X轴旋转
     * @return mixed
     */
    function XRotate();

    /**Y轴旋转
     * @return mixed
     */
    function YRotate();
}

/**具体产品角色
 * Class XProduct        X轴旋转产品
 */
class XProduct implements IProduct
{
    private $xMax=1;
    private $yMax=1;

    function __construct($xMax,$yMax)
    {
        $this--->xMax=$xMax;
        $this->yMax=1;
    }

    function XRotate()
    {
        echo 您好,我是X轴旋转产品,X轴转转转。。。。。。;
    }

    function YRotate()
    {
        echo 抱歉,我是X轴旋转产品,我没有Y轴。。。。。。;
    }
}

/**具体产品角色
 * Class YProduct        Y轴旋转产品
 */
class YProduct implements IProduct
{
    private $xMax=1;
    private $yMax=1;

    function __construct($xMax,$yMax)
    {
        $this->xMax=1;
        $this->yMax=$yMax;
    }

    function XRotate()
    {
        echo 抱歉,我是Y轴旋转产品,我没有X轴。。。。。。;
    }

    function YRotate()
    {
        echo 您好,我是Y轴旋转产品,Y轴转转转。。。。。。;
    }
}

/**具体产品角色
 * Class XYProduct        XY轴都可旋转产品
 */
class XYProduct implements IProduct
{
    private $xMax=1;
    private $yMax=1;

    function __construct($xMax,$yMax)
    {
        $this->xMax=$xMax;
        $this->yMax=$yMax;
    }

    function XRotate()
    {
        echo 您好,我是XY轴都可旋转产品,X轴转转转。。。。。。;
    }

    function YRotate()
    {
        echo 您好,我是XY轴都可旋转产品,Y轴转转转。。。。。。;
    }
}

/**工厂角色
 * Class ProductFactory
 */
class ProductFactory
{
    static function GetInstance($xMax,$yMax)
    {
        if($xMax>1 && $yMax===1)
        {
            return new XProduct($xMax,$yMax);
        }
        elseif($xMax===1 && $yMax>1)
        {
            return new YProduct($xMax,$yMax);
        }
        elseif($xMax>1 && $yMax>1)
        {
            return new XYProduct($xMax,$yMax);
        }
        else
        {
            return null;
        }
    }
}

登录后复制

测试代码:

<!--?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/4/9
 * Time: 21:54
 */
require_once ./SimpleFactory/SimpleFactory.php;

header(Content-Type:text/html;charset=utf-8);

$pro=array();
$pro[]=ProductFactory::GetInstance(1,12);
$pro[]=ProductFactory::GetInstance(12,1);
$pro[]=ProductFactory::GetInstance(12,12);
$pro[]=ProductFactory::GetInstance(0,12);

foreach($pro as $v)
{
    if($v)
    {
        echo <br/-->;
        $v->XRotate();
        echo 
;
        $v->YRotate();
    }
    else
    {
        echo 非法产品!
;
    }
    echo 
登录后复制

; }
用浏览器访问测试代码,我们可以发现创建的对象依次是YProduct,XProduct,XYProduct,null。简单工厂的核心代码在于工厂(ProductFactory)这个角色,这里根据传入的xMax与yMax值去创建不同的对象,这便是简单工厂的实质,而且我们在测试调用客户端根本不知道具体的产品类是什么样,这样就做到了调用与创建的分离。

 

 

简单工厂的优点:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。

简单工厂的缺点:当产品修改时,工厂类也要做相应的修改,比如要增加一种操作类,如求M数的N次方,就得改case,修改原有类,违背了开放-封闭原则。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java框架中设计模式与架构模式的区别 Java框架中设计模式与架构模式的区别 Jun 02, 2024 pm 12:59 PM

在Java框架中,设计模式和架构模式的区别在于:设计模式定义了在软件设计中解决常见问题的抽象解决方案,关注类和对象之间的交互,如工厂模式。架构模式定义了系统结构和模块之间的关系,关注系统组件的组织和交互,如分层架构。

Java设计模式之装饰器模式剖析 Java设计模式之装饰器模式剖析 May 09, 2024 pm 03:12 PM

装饰器模式是一种结构型设计模式,允许动态添加对象功能,无需修改原始类。它通过抽象组件、具体组件、抽象装饰器和具体装饰器的协作实现,可以灵活扩展类功能,满足变化的需求。示例中,将牛奶和摩卡装饰器添加到Espresso,总价为2.29美元,展示了装饰器模式在动态修改对象行为方面的强大功能。

PHP 设计模式实战案例解析 PHP 设计模式实战案例解析 May 08, 2024 am 08:09 AM

1.工厂模式:分离对象创建和业务逻辑,通过工厂类创建指定类型的对象。2.观察者模式:允许主题对象通知观察者对象其状态更改,实现松耦合和观察者模式。

Java设计模式之适配器模式的妙用 Java设计模式之适配器模式的妙用 May 09, 2024 pm 12:54 PM

适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如MediaPlayer)可以播放高级格式的媒体(如VLC),尽管其本身仅支持普通媒体格式(如MP3)。

设计模式如何应对代码维护难题 设计模式如何应对代码维护难题 May 09, 2024 pm 12:45 PM

设计模式通过提供可重用和可扩展的解决方案来解决代码维护难题:观察者模式:允许对象订阅事件,并在事件发生时收到通知。工厂模式:提供了一种创建对象的集中式方式,而无需依赖具体类。单例模式:确保一个类只有一个实例,用于创建全局可访问的对象。

PHP设计模式:测试驱动开发实践 PHP设计模式:测试驱动开发实践 Jun 03, 2024 pm 02:14 PM

TDD用于编写高质量PHP代码,步骤包括:编写测试用例,描述预期功能并使其失败。编写代码,仅使测试用例通过,无需过分优化或详细设计。测试用例通过后,优化和重构代码以提高可读性、可维护性和可扩展性。

Guice框架中设计模式的应用 Guice框架中设计模式的应用 Jun 02, 2024 pm 10:49 PM

Guice框架应用了多项设计模式,包括:单例模式:通过@Singleton注解确保类只有一个实例。工厂方法模式:通过@Provides注解创建工厂方法,在依赖注入时获取对象实例。策略模式:将算法封装成不同策略类,通过@Named注解指定具体策略。

java框架中使用设计模式的优缺点有哪些? java框架中使用设计模式的优缺点有哪些? Jun 01, 2024 pm 02:13 PM

Java框架中使用设计模式的优点包括:代码可读性、可维护性和可扩展性增强。缺点包括:过度使用导致复杂性、性能开销以及学习曲线陡峭。实战案例:代理模式用于延迟加载对象。明智地使用设计模式可充分利用其优势并最小化缺点。

See all articles