1、简单工厂模式(Simple Factory)定义

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。

2、简单工厂模式(Simple Factory)UML类图

3、简单工厂模式(Simple Factory)实例代码

ConcreteFactory.php

<?phpnamespace DesignPatterns\Creational\SimpleFactory;/*** ConcreteFactory类*/
class ConcreteFactory
{/*** @var array*/protected $typeList;/*** 你可以在这里注入自己的车子类型*/public function __construct(){$this->typeList = array('bicycle' => __NAMESPACE__ . '\Bicycle','other' => __NAMESPACE__ . '\Scooter');}/*** 创建车子** @param string $type a known type key** @return VehicleInterface a new instance of VehicleInterface* @throws \InvalidArgumentException*/public function createVehicle($type){if (!array_key_exists($type, $this->typeList)) {throw new \InvalidArgumentException("$type is not valid vehicle");}$className = $this->typeList[$type];return new $className();}
}

VehicleInterface.php

<?phpnamespace DesignPatterns\Creational\SimpleFactory;/*** VehicleInterface 是车子接口*/
interface VehicleInterface
{/*** @param mixed $destination** @return mixed*/public function driveTo($destination);
}

Bicycle.php

<?phpnamespace DesignPatterns\Creational\SimpleFactory;/*** 自行车类*/
class Bicycle implements VehicleInterface
{/*** @param mixed $destination** @return mixed|void*/public function driveTo($destination){}
}

Scooter.php

<?phpnamespace DesignPatterns\Creational\SimpleFactory;/*** 摩托车类*/
class Scooter implements VehicleInterface
{/*** @param mixed $destination*/public function driveTo($destination){}
}

4、简单工厂模式测试代码

Tests/SimpleFactoryTest.php

<?phpnamespace DesignPatterns\Creational\SimpleFactory\Tests;use DesignPatterns\Creational\SimpleFactory\ConcreteFactory;/*** SimpleFactoryTest 用于测试简单工厂模式*/
class SimpleFactoryTest extends \PHPUnit_Framework_TestCase
{protected $factory;protected function setUp(){$this->factory = new ConcreteFactory();}public function getType(){return array(array('bicycle'),array('other'));}/*** @dataProvider getType*/public function testCreation($type){$obj = $this->factory->createVehicle($type);$this->assertInstanceOf('DesignPatterns\Creational\SimpleFactory\VehicleInterface', $obj);}/*** @expectedException \InvalidArgumentException*/public function testBadType(){$this->factory->createVehicle('car');}
}

5、简单工厂模式(Simple Factory)总结

采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

PHP 设计模式系列之简单工厂模式(Simple Factory)相关推荐

  1. Java设计模式之简单工厂模式(Simple Factory)

    [Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...

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

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

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

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

  4. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  5. 大话设计模式Python实现-简单工厂模式

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...

  6. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的"小弟",我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式, ...

  7. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  8. 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式(转载)

    源地址:http://doc.chinaunix.net/python/200703/202210.shtml 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式 ...

  9. 设计模式(2)——创建型——工厂相关:简单工厂(Simple factory),工厂方法(Factory method),抽象工厂(Abstract factory)

    概要 这里试图描述23个设计模式中的两个工厂(Factory)相关的设计模式:工厂方法(Factorymethod),抽象工厂(Abstract factory). 注意点: 这两个都属于创建型设计模 ...

最新文章

  1. 搜狗输入法电脑版_搜狗输入法小米版升级简介
  2. 【elementUI】el-tree搜索时加载子节点对应父节点、父节点对应子节点树
  3. Android中的数据传递之Parcelable接口
  4. 用WidgeDuino创建一个SCADA(监控与数据採集)系统
  5. Python基础概念_1_环境安装
  6. Cnblogs美化总结
  7. navicat10.1.7英文版_【纯干货】风险评估和管理(PDA TR 49内容节选11 中英文版)...
  8. 牛客网--整数与IP地址间的转换
  9. 李开复:听AI大佬吐槽真实的人工智能
  10. 霍因科技获首届全国信创产业生态创新奖
  11. MINIGUI编译方法【原创】
  12. Spring 基础 编写基本的控制器(系列号3)
  13. 同济大学计算机直博生条件,同济大学攻读博士学位研究生培养工作规定(2016年修订).doc...
  14. python如何画三角形的外接圆_用python画三角形外接圆和内切圆
  15. Python爬虫实战(1):抓取毒舌电影最新推送
  16. WPS office根目录在哪?_wps和office的区别是什么
  17. C语言:Fibonacci数列的递归解法和非递归解法
  18. 北京电信东区电信局 Excel人力资源应用培训
  19. CCF中国开源大会开源雨林论坛丨七大亮点议题抢鲜看!
  20. codon也将py程序加速了90倍了,C/C++调用codon

热门文章

  1. 看大数据时代下的IT架构(1)图片服务器之演进史
  2. vxworks6.6 bootrom下升级flash bootrom
  3. 初学opencv/基本操作
  4. Nitro League 出品 | P2E 系列 101——第四部分
  5. 建议使用 Bcrypt加密算法 代替 MD5/SHA1
  6. Java Spring+Ehcache,完成配置后缓存失效问题
  7. html幻灯片效果需要js吗,如何用网页播放幻灯片-RevealJS
  8. 白敬亭出任Crocs全球时尚代言人
  9. 电脑下载的qlv格式视频怎么转换成MP4
  10. MySQL/ 第一章 MySQL数据库