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 "<br/>";
        $v->YRotate();
    }
    else
    {
        echo "非法产品!<br/>";
    }
    echo "<hr/>";
}

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


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

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


          更多详情敬请关注我的视频课程:

         PHP面向对象设计模式


目录
相关文章
|
1月前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
34 1
|
14天前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
23天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
16 1
|
27天前
|
设计模式 监控 中间件
深入理解PHP中的中间件模式
【10月更文挑战第20天】探索PHP编程世界中的“交通枢纽”——中间件模式。从代码层面剖析如何实现请求和响应的高效管理,以及如何在开发中应用这一模式来增强项目的扩展性和维护性。
|
1月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
1月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
14天前
|
设计模式 缓存 中间件
探索PHP中的中间件模式
【10月更文挑战第33天】在编程世界中,设计模式是解决常见问题的模板。本文将带你领略PHP中中间件模式的魅力,它如何优雅地处理请求,并保持代码的整洁与可维护性。通过实际代码示例,我们将一步步实现一个简单的中间件框架,让你轻松理解并应用到自己的项目中。
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
30 1
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
28 2

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面