PHP 设计模式系列之简单工厂模式(Simple Factory)
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)相关推荐
- Java设计模式之简单工厂模式(Simple Factory)
[Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...
- Net设计模式之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...
- 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结
4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了" ...
- 手撕设计模式之「简单工厂模式」(Java描述)
前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...
- 大话设计模式Python实现-简单工厂模式
简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...
- 设计模式的征途—2.简单工厂(Simple Factory)模式
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的"小弟",我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式, ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
- 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式(转载)
源地址:http://doc.chinaunix.net/python/200703/202210.shtml 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式 ...
- 设计模式(2)——创建型——工厂相关:简单工厂(Simple factory),工厂方法(Factory method),抽象工厂(Abstract factory)
概要 这里试图描述23个设计模式中的两个工厂(Factory)相关的设计模式:工厂方法(Factorymethod),抽象工厂(Abstract factory). 注意点: 这两个都属于创建型设计模 ...
最新文章
- 搜狗输入法电脑版_搜狗输入法小米版升级简介
- 【elementUI】el-tree搜索时加载子节点对应父节点、父节点对应子节点树
- Android中的数据传递之Parcelable接口
- 用WidgeDuino创建一个SCADA(监控与数据採集)系统
- Python基础概念_1_环境安装
- Cnblogs美化总结
- navicat10.1.7英文版_【纯干货】风险评估和管理(PDA TR 49内容节选11 中英文版)...
- 牛客网--整数与IP地址间的转换
- 李开复:听AI大佬吐槽真实的人工智能
- 霍因科技获首届全国信创产业生态创新奖
- MINIGUI编译方法【原创】
- Spring 基础 编写基本的控制器(系列号3)
- 同济大学计算机直博生条件,同济大学攻读博士学位研究生培养工作规定(2016年修订).doc...
- python如何画三角形的外接圆_用python画三角形外接圆和内切圆
- Python爬虫实战(1):抓取毒舌电影最新推送
- WPS office根目录在哪?_wps和office的区别是什么
- C语言:Fibonacci数列的递归解法和非递归解法
- 北京电信东区电信局 Excel人力资源应用培训
- CCF中国开源大会开源雨林论坛丨七大亮点议题抢鲜看!
- codon也将py程序加速了90倍了,C/C++调用codon