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通过header实现文本文件下载的代码
Aug 08 PHP
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
Destoon模板制作简明教程
Jun 20 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP常用的排序和查找算法
Aug 06 PHP
PHP面向对象程序设计之对象生成方法详解
Dec 02 PHP
PHP实现的CURL非阻塞调用类
Jul 26 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
php不用正则验证真假身份证
2013/11/06 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
php判断当前操作系统类型
2015/10/28 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
php微信开发之关注事件
2018/06/14 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
JS实现页面打印功能
2017/03/16 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
koa-passport实现本地验证的方法示例
2020/02/20 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
学生信息管理系统python版
2018/10/17 Python
python调用接口的4种方式代码实例
2019/11/19 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
事业单位年度考核评语
2014/12/31 职场文书
体育活动总结
2015/02/04 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
关于mysql中string和number的转换问题
2022/06/14 MySQL