PHP设计模式之工厂模式详解


Posted in PHP onOctober 24, 2017

在开发大型系统时,往往会出现这样一种情况:

我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,那么什么是紧耦合呢?紧耦合就是指系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。

这时,工厂模式的作用性就体现出来了。

工厂模式    

就是解决这样的一些情况的设计方法。

工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类,修改配置等。

/*基本工厂模式代码*/

<?php 
/** 
 * 基本工厂模式 
 * */ 
class User { 
 private $username; 
 public function __construct($username) { 
  $this->username = $username; 
 } 
  
 public function getUser() { 
  return $this->username; 
 } 
} 
 
class userFactory { 
 static public function createUser() { 
  return new User('Jack'); 
 } 
} 
 
$user = userFactory::createUser();echo $user->getUser(); 

?>

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

<?php

/** 
 *简单工厂模式 
 * */ 
interface userProperties { 
 function getUsername(); 
 function getGender(); 
 function getJob(); 
} 
class User implements userProperties{ 
 private $username; 
 private $gender; 
 private $job; 
 public function __construct($username, $gender, $job) { 
  $this->username = $username; 
  $this->gender = $gender; 
  $this->job = $job; 
 } 
 
 public function getUsername() { 
  return $this->username; 
 } 
 
 public function getGender() { 
  return $this->gender; 
 } 
 
 public function getJob() { 
  return $this->job; 
 } 
} 
 
class userFactory { 
 static public function createUser($properties = []) { 
  return new User($properties['username'], $properties['gender'], $properties['job']); 
 } 
} 
 
$employers = [ 
 ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], 
 ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], 
 ]; 
$user = userFactory::createUser($employers[0]); 
echo $user->getUsername(); 
 
?>

工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。

<?php
/** 
 * 工厂方法模式 
 **/ 
interface userProperties { 
 function getUsername(); 
 function getGender(); 
 function getJob(); 
} 
 
interface createUser { 
 function create($properties); 
} 
 
class User implements userProperties{ 
 private $username; 
 private $gender; 
 private $job; 
 public function __construct($username, $gender, $job) { 
  $this->username = $username; 
  $this->gender = $gender; 
  $this->job = $job; 
 } 
 
 public function getUsername() { 
  return $this->username; 
 } 
 
 public function getGender() { 
  return $this->gender; 
 } 
 
 public function getJob() { 
  return $this->job; 
 } 
} 
 
class userFactory { 
 private $user; 
 public function __construct($properties = []) { 
  $this->user = new User($properties['username'], $properties['gender'], $properties['job']); 
 } 
 
 public function getUser() { 
  return $this->user; 
 } 
} 
 
class FactoryMan implements createUser { 
 function create($properties) { 
  return new userFactory($properties); 
 } 
} 
 
class FactoryWoman implements createUser { 
 function create($properties) { 
  return new userFactory($properties); 
 } 
} 
 
class clientUser { 
 static public function getClient($properties) { 
  $fac = new FactoryMan; 
  $man = $fac->create($properties); 
  echo $man->getUser()->getUsername(); 
 } 
} 
 
$employers = [ 
 ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], 
 ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], 
 ]; 
$user = clientUser::getClient($employers[0]); 
 
?>

抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

<?php

/** 
 * 抽象工厂模式 
 * */ 
 
interface userProperties { 
 function getUsername(); 
 function getGender(); 
 function getJob(); 
} 
 
interface createUser { //将对象的创建抽象成一个接口 
 function createOpen($properties);//内向创建 
 function createIntro($properties);//外向创建 
} 
 
class User implements userProperties{ 
 private $username; 
 private $gender; 
 private $job; 
 public function __construct($username, $gender, $job) { 
  $this->username = $username; 
  $this->gender = $gender; 
  $this->job = $job; 
 } 
 
 public function getUsername() { 
  return $this->username; 
 } 
 
 public function getGender() { 
  return $this->gender; 
 } 
 
 public function getJob() { 
  return $this->job; 
 } 
} 
 
class userFactory { 
 private $user; 
 public function __construct($properties = []) { 
  $this->user = new User($properties['username'], $properties['gender'], $properties['job']); 
 } 
 
 public function getUser() { 
  return $this->user; 
 } 
} 
 
class FactoryMan implements createUser { 
 function createOpen($properties) { 
  return new userFactory($properties); 
 } 
 
 function createIntro($properties) { 
  return new userFactory($properties); 
 } 
} 
 
class FactoryWoman implements createUser { 
 function createOpen($properties) { 
  return new userFactory($properties); 
 } 
 
 function createIntro($properties) { 
  return new userFactory($properties); 
 } 
} 
 
class clientUser { 
 static public function getClient($properties) { 
  $fac = new FactoryMan; 
  $man = $fac->createOpen($properties); 
  echo $man->getUser()->getUsername(); 
 } 
} 
 
$employers = [ 
 ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'], 
 ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'], 
 ]; 
$user = clientUser::getClient($employers[0]); 
?>

如有错误,请指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 删除无限级目录与文件代码共享
Nov 22 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
ThinkPHP控制器详解
Jul 27 PHP
php验证手机号码
Nov 11 PHP
php自动载入类用法实例分析
Jun 24 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
Yii框架连表查询操作示例
Sep 06 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 #PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 #PHP
php实现的后台表格分页功能示例
Oct 23 #PHP
php双层循环(九九乘法表)
Oct 23 #PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 #PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 #PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
Oct 23 #PHP
You might like
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
python杀死一个线程的方法
2015/09/06 Python
Python+django实现文件下载
2016/01/17 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
python3调用windows dos命令的例子
2019/08/14 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
家长通知书教师评语
2014/04/17 职场文书
质量在我心中演讲稿
2014/09/02 职场文书