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)
blank

相关推荐

  • 请不要拿ipad和手机、上网本相提并论「建议收藏」

    请不要拿ipad和手机、上网本相提并论「建议收藏」苹果公司最近推出了ipad,但网上的评论不是很好,我觉得,一个好的产品会改变人们对某些事物的认识,甚至是人们的生活习惯。网上有ipad的十大罪状,有些我不了解,但有我认为是无稽之谈。不支持多点触摸首先,多点触摸苹果公司在他们的产品中应用的比较多的,比如iphone和macair,当然这样的技术迁移到ipad上面肯定没有任何问题,但是,网上认为这样的技术在ipad的设计上被取消

  • java 正则表达式 替换 html,java 正则表达式 替换 html「建议收藏」

    java 正则表达式 替换 html,java 正则表达式 替换 html「建议收藏」java正则表达式替换html[2021-01-2922:37:07]简介:java正则表达式用法:1、使用Pattern类进行字符串的拆分,使用的方法是【String[]split(CharSequenceinput)】;2、使用Matcher类进行字符串的验证和替换。相关免费学习推荐:javaphp正则表达式替换图片地址的方法:首先PHP正则提取图片img标记中的任意属性;然后…

  • 修给linux用户密码报错Authentication token manipulation error

    修给linux用户密码报错Authentication token manipulation error修给linux用户密码报错Authentication token manipulation error

  • Matlab自定义颜色图

    Matlab自定义颜色图介绍Matlab自带颜色图比较单调,很多时候无法达到其它绘图工具,如:NCL、Pythonmatplotlib、GMT等绘图软件颜色图效果。下面就介绍如何将NCL等颜色图为己所用。颜色图下载NCL官网提供了上述绘图工具的颜色图合集,因此只需要将需要的颜色图下载后进行使用即可。选择颜色图WhiteBlueGreenYellowRed下载。Matlab读取下载的颜色表clc;clearall;closeallfiguremesh(peaks)colorbarcolor=n

  • python创建线程池_python爬虫多线程和多进程

    python创建线程池_python爬虫多线程和多进程importthreadingfromconcurrent.futures.threadimportThreadPoolExecutorlock=threading.Lock()deffunc(x,y):”””打印x次y”””globallockforiinrange(x):withlock:print(y)#线程池最大线程数3withThreadPool

  • C语言的文件操作_C语言调用文件

    C语言的文件操作_C语言调用文件文件打开与关闭C文件操作用库函数实现,包含在stdio.h中。文件使用方式:打开文件→文件读/写→关闭文件系统自动打开和关闭三个标准文件:标准输入——键盘 stdin标准输出——显示器 stdout标准出错输出—–显示器 stderr文件读写操作当我们把文件打开之后,就可以对它进行读与…

发表回复

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

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