PHP之工厂方法模式(三)
定义
定义一个用于创建对象的接口(抽象工厂类),让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类(抽象工厂类的子类)。
工厂方法模式是简单工厂模式的进一步抽象和推广。在简单工厂模式中,当新增一个类时都需要改动一次工厂类方法。而工厂方法模式中将一个类的实例化延续到抽象工厂的子类,使得新增一个类时只需创建一个对应的工厂类即可。因此工厂方法模式符合开闭原则。
使用场景
工厂方法模式更适合需要创建一系列实例的场景。工厂方法模式的特点是将简单工厂模式的内部逻辑判断移到了客户端代码中进行,也就是工厂方法模式是通过在客户端决定实例化哪一个具体工厂来创建相应的实例。
如这样一个场景:几个大学生学雷锋做好事,帮一个老人家做家务活。分别用简单工厂模式和工厂方法模式实现如下:
//简单工厂模式
$leiFengA = SimpleFactory->CreateLeiFeng('学雷锋的大学生');
$leiFengA->BuyRice();
$leiFengB = SimpleFactory->CreateLeiFeng('学雷锋的大学生');
$leiFengB->Sweep();
$leiFengC = SimpleFactory->CreateLeiFeng('学雷锋的大学生');
$leiFengC->Wash();
//工厂方法模式
$factory = new UndergraduateFactory();
$leiFengA = factory->CreateLeiFeng();
$leiFengA->BuyRice();
$leiFengB = factory->CreateLeiFeng();
$leiFengB->Sweep();
$leiFengC = factory->CreateLeiFeng();
$leiFengC->Wash();
如果这时有个需求,由于大学生们毕业了各奔东西,没法再帮老人家做家务活了,需要由社区志愿者来代替他们做好事。那么修改上面客户端代码时,简单工厂模式需要将所有的“学雷锋的大学生”替换成社区志愿者。而工厂方法模式中,只需要将UndergraduateFactory()(学雷锋的大学生工厂)换成VolunteerFactory()(社区志愿者工厂)。
类图

PHP代码示例
//雷锋类
class LeiFeng
{
public function sweep()
{
echo '扫地';
}
public function wash()
{
echo '洗衣';
}
public function buyRice()
{
echo '买米';
}
}
//大学生
class Undergraduate extends LeiFeng
{
}
//社区志愿者
class Volunteer extends LeiFeng
{
}
//雷锋工厂类
abstract class LeiFengFactory
{
abstract public function createLeiFeng();
}
//学雷锋的大学生工厂类
class UndergraduateFactory extends LeiFengFactory
{
public function createLeiFeng()
{
return new Undergraduate();
}
}
//社区志愿者工厂类
class VolunteerFactory extends LeiFengFactory
{
public function createLeiFeng()
{
return new Volunteer();
}
}
//客户端
$factory = new UndergraduateFactory();
$leiFeng = $factory->createLeiFeng();
$leiFeng->sweep();
PHP之工厂方法模式(三)的更多相关文章
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- java之设计模式工厂三兄弟之工厂方法模式
[学习难度:★★☆☆☆,使用频率:★★★★★] 简单工厂模式虽然简单,但存在一个很严重的问题.当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码 ...
- Unity C# 设计模式(三)工厂方法模式
定义: 定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类. 这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- 设计模式(三)——Java工厂方法模式
工厂方法模式 1 看一个新的需求 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza.北京的胡椒 pizza 或者是伦敦的奶酪 pizza.伦敦的胡椒 pizza. ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
随机推荐
- LINUX下的U盘挂载
linux下如果没有图形界面的情况下就要我们自己熟悉命令来挂载U盘,下面给大家详细描述下U盘的挂载过程. 1. 插入U盘 2. #sudo fdisk –l 查看所挂载盘符名称如下图,假设盘符名称为s ...
- LNMP搭建01 -- 编译安装MySQL 5.6.14 和 LNMP相关的区别
[编译安装MySQL 5.6.14] [http://www.cnblogs.com/xiongpq/p/3384681.html ] [mysql-5.6.14.tar.gz 下载] http:/ ...
- Kubernetes 概念整理
注:以下大部分内容来自网上摘录,以便后期查阅. Kubernetes (通常称为 K8s) 是用于自动部署.扩展和管理容器化(containerized)应用程序的开源系统,是 Google 内部工具 ...
- 接口测试基础(fiddler、postman的使用、python实现测试接口程序)
写在前面:本文主要的章节规划: 1.什么是接口测试 另外,有的时候会直接调用别的公司的接口,比如银行的.淘宝的.支付宝的,此时也需要做接口测试以及验证数据: 做接口测试的好处: 其中, ...
- 以kaggle-titanic数据为基础的完整的机器学习
1. 引入所有需要的包 # -*- coding:utf-8 -*- # 忽略警告 import warnings warnings.filterwarnings('ignore') # 引入数据处理 ...
- 第二十一章 Django的分页与cookie
第二十一章 Django的分页与cookie 第一课 模板 1.模板的继承 在Template目录下新建模板master.html <!DOCTYPE html> <html lan ...
- 简单的GIT上传
简单的GIT上传 上传项目时先新建一个 文件夹 mkdir test 然后在切换到test文件夹中然后把github 中的项目拷贝下来 git glone url 然后git init 查看文件 然后 ...
- python 常见错误和异常 函数 正则表达式及多线程编程
生成随机密码#!/usr/bin/env python import stringfrom random import choice def gen_pass(num=9): all_chs = st ...
- 使用simhash库来进行网页去重
首先感谢作者yanyiwu贡献的开源项目https://github.com/yanyiwu/simhash.在做项 目过程中,翻了一遍<这就是搜索引擎 核心技术详解>这本书的查重算法, ...
- 实战DeviceIoControl 之四:获取硬盘的详细信息
Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...