php 开发模式之工厂模式

php 开发模式之工厂模式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

<?php

// 开发模式之工程模式
// 工厂模式:
// 由工厂类根据参数来决定创建出哪一种产品类的实例;
// 工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。
// 工厂模式的最主要作用就是对象创建的封装、简化创建对象操作。 
// 简单的说,就是调用工厂类的一个方法(传入参数)来得到需要的类;


//示例1 最基本的工厂模式

class Myname{
	public function OutPutMyName(){
		return 'name is rongyouyuan!~';
	}
}
class NameFactory{
	public static function Namefunc(){
		return new Myname();
	}
}
$obj=NameFactory::Namefunc();
echo $obj->OutPutMyName();
?>

上面是最最简单的工厂模式,下面使用工厂模式实现一个简单的计算器

<?php
//定义一个抽象类
abstract class operation
{
    protected $_numA = 0;
    protected $_numB = 0;
    protected $_result = 0;
    public function __construct($a, $b)
    {
        $this->_numA = $a;
        $this->_numB = $b;
    }
    //抽象方法所有子类必须实现该方法
    protected abstract function getResult();
}
//加法运算
class operationAdd extends operation
{
    public function getResult()
    {
        $this->_result = $this->_numA + $this->_numB;
        return $this->_result;
    }
}
//减法运算
class operationSub extends operation
{
    public function getResult()
    {
        $this->_result = $this->_numA - $this->_numB;
        return $this->_result;
    }
}
//乘法运算
class operationMul extends operation
{
    public function getResult()
    {
        $this->_result = $this->_numA * $this->_numB;
        return $this->_result;
    }
}
//除法运算
class operationDiv extends operation
{
    public function getResult()
    {
        $this->_result = $this->_numA / $this->_numB;
        return $this->_result;
    }
}
//定义工厂类
class operationFactory
{
    //创建保存示例的静态成员变量
    private static $obj;
    //创建实例的静态方法
    public static function CreateOperation($type, $a, $b)
    {
        switch ($type) {
        case '+':
            self::$obj = new operationAdd($a, $b);
            break;
        case '-':
            self::$obj = new operationSub($a, $b);
            break;
        case '*':
            self::$obj = new operationMul($a, $b);
            break;
        case '/':
            self::$obj = new operationDiv($a, $b);
            break;
        }
        //最后返回这个实例
        return self::$obj;
    }
}
//最后我们使用工厂模式
$obj = operationFactory::CreateOperation('+', 100, 20);
echo $obj->getResult();

最后 抽象工厂

以下内容转载自:http://blog.csdn.net/zhengzhb/article/details/7359385

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

类型:创建类模式

类图:

php 开发模式之工厂模式

抽象工厂模式与工厂方法模式的区别

        抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

        在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。

php 开发模式之工厂模式

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。

        明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。

抽象工厂模式的优点

        抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

 

抽象工厂模式的缺点

       产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

 

适用场景

       当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

 

总结

       无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

       所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

<?php /**  * 抽象工厂模式  * -------------  * @author      zhaoxuejie <zxj198468@gmail.com>  * @package     design pattern   * @version     v1.0 2011-12-14  */  //---------------------------------------------------------------------------// 抽象工厂(AbstractFactory)角色:它声明一个创建抽象产品对象的接口。// 通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。//---------------------------------------------------------------------------// 具体工厂(ConcreteFactory)角色:实现创建产品对象的操作。// 客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。//---------------------------------------------------------------------------// 抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。//---------------------------------------------------------------------------// 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。// 其内部包含了应用程序的业务逻辑。//---------------------------------------------------------------------------///抽象工厂interface AnimalFactory{	public function createCat();	public function createDog();}//黑色动物具体工厂class BlackAnimalFactory implements AnimalFactory{	function createCat(){		return new BlackCat();	}	function createDog(){		return new BlackDog();	}}//白色动物具体工厂class WhiteAnimalFactory implements AnimalFactory{	function createCat(){		return new WhiteCat();	}	function createDog(){		return new WhiteDog();	}}//抽象产品interface Cat{	function Voice();}interface Dog{	function Voice();}//具体产品 class BlackCat implements Cat {            function Voice(){          echo '黑猫喵喵……';      }  }    class WhiteCat implements Cat {            function Voice(){          echo '白猫喵喵……';      }  }    class BlackDog implements Dog {            function Voice(){          echo '黑狗汪汪……';            }  }    class WhiteDog implements Dog {            function Voice(){          echo '白狗汪汪……';            }  }  //客户端class CLient{	public static function main(){		self::run(new BlackAnimalFactory());		self::run(new WhiteAnimalFactory());	}	public static function run(AnimalFactory $AnimalFactory){			$cat=$AnimalFactory->createCat();		$cat->Voice();		$dog=$AnimalFactory->createDog();		$dog->Voice();	}}CLient::main();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164360.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • HTML期末设计——代码篇[通俗易懂]

    HTML期末设计——代码篇[通俗易懂]事先声明这个网页设计也就是用了我学到的知识做的一个中规中矩的网页,可以给以后的大一新生们做个参考,和商业网站的效果肯定是没得比的,期望太高的可以关掉了,要严词批评我的请不要在我这说,当然,温柔的话,可以引入页效果图:<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″> <title>欢迎来到香氛密语</title> <style>

  • NPS——搭建属于你的内网穿透平台[通俗易懂]

    NPS——搭建属于你的内网穿透平台[通俗易懂]内网穿透

  • 设置java编译级别

    设置java编译级别右键项目—->properties—–>JavaComplier—->javaCompilancelevel
    —->1.6

  • HttpServletResponse设置ContentType失效

    HttpServletResponse设置ContentType失效现象:使用postman测试响应ContentType没有值这是我的部分代码:@Overridepublicvoiddownload(LongbuildingId,HttpServletResponseresponse)throwsIOException{ ……IoUtil.write(response.getOutputStream(),true,bytes);response.setContentType(imag

  • MATLAB中求矩阵的逆矩阵方法(2种)「建议收藏」

    MATLAB中求矩阵的逆矩阵方法(2种)「建议收藏」方法一:使用inv()函数求矩阵的逆第一步:打开matlab之后,在命令行窗口中输入a=[123;456;789],新建一个a方矩阵,如下图所示:第二步:在命令行窗口中输入inv(a),按回车键,可以看到得到了矩阵的逆,如下图所示:注意:a矩阵可逆的条件是非奇异方法二:使用a^-1格式求矩阵的逆第一步:在命令行窗口中输入a^-1,按回车键,可以得到矩阵的逆,如下图所示:其实,还可以给-1加括号“()”,a^(-1),如下图:注:a必须是方针,即行数和列数相等。…

  • win7默认共享(win7开启默认共享)

    访问win7默认共享:HEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\SystemDWORD值LocalAccountTokenFilterPolicy设置16数据值数据为1安全选项”,在右侧找到“网络安全:LAN管理器身份验证级别”,–选中“发送LM和NTLM响应(&)”

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号