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 什么是PEAR?
Mar 19 PHP
php 正则匹配函数体
Aug 25 PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
CI框架常用方法小结
May 17 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
PHP静态成员变量
Feb 14 PHP
swoole_process实现进程池的方法示例
Oct 29 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
Mar 07 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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
计数器详细设计
2006/10/09 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
vue2实现数据请求显示loading图
2017/11/28 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Python模块的加载讲解
2019/01/15 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
python中常见错误及解决方法
2020/06/21 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
类如何去实现接口
2013/12/19 面试题
电子商务专业学生的自我鉴定
2013/11/28 职场文书
11月红领巾广播稿
2014/01/17 职场文书
安全保证书范文
2014/04/29 职场文书
工程项目经理任命书
2014/06/05 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript