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 相关文章推荐
ASP知识讲座四
Oct 09 PHP
多重?l件?合查?(二)
Oct 09 PHP
php 购物车的例子
May 04 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php遍历目录viewDir函数
Dec 15 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
WordPress网站性能优化指南
Nov 18 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 PHP
php无限级分类实现评论及回复功能
Feb 18 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
php+oracle 分页类
2006/10/09 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
javascript常用的方法分享
2015/07/01 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
python占位符输入方式实例
2019/05/27 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python 制作本地应用搜索工具
2021/02/27 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
中国文明网签名寄语
2014/01/18 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
创新社会管理心得体会
2014/09/12 职场文书
教师党员个人自我评价
2015/03/04 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
mysql 获取相邻数据项
2022/05/11 MySQL
vue实现简易音乐播放器
2022/08/14 Vue.js