什么是工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式可分为以下三种类型,需要根据不同需求来决定使用哪一种模式:
1.简单工厂(不是真正意义上的设计模式)
2.工厂方法(定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类实例化推迟到子类)
3.抽象工厂(提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类)
这三种模式从上到下逐步抽象,并且更具一般性。

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那我们是否一定要在代码中遍布工厂呢?大可不必。也许在下面情况下你可以考虑使用工厂方法模式:

当客户程序不需要知道要使用对象的创建过程。
客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。

面向对象原则
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合而努力
类应该对扩展开放,对修改关闭
依赖抽象,不是依赖具体类(新的原则)

要点
1. 所有的工厂都是用来封装对象的创建。
2. 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
3. 工厂方法使用继承:把对象的创建委托给子类子类实现工厂方法来创建对象。
4. 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
5. 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
6. 工厂方法允许类将实例化延迟到子类进行。
7. 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
8. 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
9. 工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。

理解PHP的工厂模式Factory Pattern
工厂类就是一个专门用来创建其它对象的类,工厂类在多态性编程实践中是非常重要的。它允许动态替换类,修改配置,会使应用程序更加灵活。掌握工厂模式对Web开发是必不可少的。

工厂模式通常用来返回类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者。

通常工厂模式有一个关键的构造,即一般被命名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象

Program List:基本的工厂类

<?php
class Fruit {// 对象从工厂类返回
}
Class FruitFactory {public static function factory() {// 返回对象的一个新实例
return new Fruit();
}
}
// 调用工厂
$instance = FruitFactory::factory();
?>

Program List:利用工厂类生产对象

<?php
class Example
{// The parameterized factory methodpublic static function factory($type){if (include_once 'Drivers/' . $type . '.php') {$classname = 'Driver_' . $type;return new $classname;} else {throw new Exception('Driver not found');}}
}
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load an SQLite Driver
$sqlite = Example::factory('SQLite');
?>

Program List:一个完整的工厂类
下面的程序定义了一个通用的工厂类,它生产能够保存你所有操作的空对象,你可以获得一个实例,这些操作都在那个实例中了。

<?php/*** Generic Factory class** This Magic Factory will remember all operations you perform on it,* and apply them to the object it instantiates.**/class FruitFactory {private $history, $class, $constructor_args;/*** Create a factory of given class. Accepts extra arguments to be passed to* class constructor.*/function __construct( $class ) {$args = func_get_args();$this->class = $class;$this->constructor_args = array_slice( $args, 1 );}function __call( $method, $args ) {$this->history[] = array('action'    => 'call','method'    => $method,'args'   => $args);}function __set( $property, $value ) {$this->history[] = array('action'    => 'set','property'    => $property,'value'        => $value);}/*** Creates an instance and performs all operations that were done on this MagicFactory*/function instance() {# use Reflection to create a new instance, using the $args $reflection_object = new ReflectionClass( $this->class ); $object = $reflection_object->newInstanceArgs( $this->constructor_args ); # Alternative method that doesn't use ReflectionClass, but doesn't support variable# number of constructor parameters.//$object = new $this->class();# Repeat all remembered operations, apply to new object.foreach( $this->history as $item ) {if( $item['action'] == 'call' ) {call_user_func_array( array( $object, $item['method'] ), $item['args'] );}if( $item['action'] == 'set' ) {$object->{$item['property']} = $item['value'];}}# Donereturn $object;}}class Fruit {private $name, $color;public $price;function __construct( $name, $color ) {$this->name = $name;$this->color = $color;}function setName( $name ) {$this->name = $name;}function introduce() {print "Hello, this is an {$this->name} {$this->sirname}, its price is {$this->price} RMB.";}}# Setup a factory$fruit_factory = new FruitFactory('Fruit', 'Apple', 'Gonn');$fruit_factory->setName('Apple');$fruit_factory->price = 2;# Get an instance$apple = $fruit_factory->instance();$apple->introduce();
?>

程序运行结果

Hello, this is an Apple , its price is 2 RMB.

9. PHP 之 Factory pattern(工厂设计模式)相关推荐

  1. Factory Pattern工厂模式

    源地址 工厂模式是一种创建型模式,提供了一种创建对象的最佳方法模式. 应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现. Hiberna ...

  2. 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结

    4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了" ...

  3. scala设计模式_Scala中的工厂设计模式

    scala设计模式 I'm going to deliver a series of Scala Design Patterns in my coming posts. I will pick-up ...

  4. Net设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction)        简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

  6. 设计模式(1):简单工厂模式(Simple Factory Pattern)

    1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...

  7. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  8. 【设计模式】工厂模式(Factory Pattern)

    1. 概述 工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式.它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

  9. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  10. 秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)

    [版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86644481 出自:shusheng007 ...

最新文章

  1. python实时处理_python实时处理log文件脚本
  2. 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量...
  3. 蓝桥杯-区间k大数查询(java)
  4. SQL重复记录查询(转载)
  5. python文件读取模式_day-2 python 文件读写模式r,r+,w,w+,a,a+的区别
  6. 小甲鱼Python笔记(下)
  7. 世界上最伟大的十个公式,看看你懂得几个?
  8. 在Windows下快速搭建SVN服务器 VisualSVN
  9. TensorFlow中的Keras用法和自定义模型和层
  10. python:实现杨辉三角
  11. mne进行ica分析
  12. Android图像适配
  13. GSM劫持+短信嗅探是什么,如何防范指南
  14. 100本软件开发最佳书籍排行榜
  15. java虚拟机win10_主编解读win10系统Java虚拟机错误的详尽解决方法
  16. 9个好用的生命科学研究工具分享
  17. 互联网日报 | 董明珠2020年直播带货476亿;滴滴橙心优选启动“小店战略”;苹果开始自研调制解调器...
  18. 计算机二进制转化教案及ppt,二进制运算及转换(课件).ppt
  19. Java 检查文件后生成8位随机数
  20. php 微信支付证书,微信支付后台进行退款操作时提示证书已过期处理(PHP)

热门文章

  1. Mysql 定时备份操作
  2. xp系统运行asp.net时候出现“服务器应用程序不可用”,vs2005无法启动调试
  3. 近期团队博客的摘要 5
  4. 亚马逊在中国失败,而中国却在亚马逊成功
  5. GGally与pairs相关关系图_史上最全(一)
  6. 实战案例:贷款分析之plotly VS ggplot2
  7. mysql开启slowquery_log_MySQL slow_query_log慢查询日志配置详解
  8. 【Windows C++笔记】winbase.h
  9. python学习笔记之hashlib
  10. c#使用资源文件完成国际化