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

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

我有一部分基础数据,是类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]);
?>

如有错误,请指正。

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

时间: 2017-10-21

php基础设计模式大全(注册树模式、工厂模式、单列模式)

废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更容易让人理解.像前两篇一样,我们这篇依旧是从名字入手.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来.不同的是,注册树

php设计模式之简单工厂模式详解

本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用.具体如下: 一.概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(A

PHP设计模式之工厂模式与单例模式

本文实例讲述了PHP设计模式之工厂模式与单例模式实现方法.分享给大家供大家参考,具体如下: 设计模式简单说应对某类问题而设计的解决方式 工厂模式:应对需求创建相应的对象 class factory{ function __construct($name){ if(file_exists('./'.$name.'.class.php')){ return new $name; }else{ die('not exist'); } } } 单例模式:只创建一个对象的实例,不允许再创建实例,节约资源(

基于php设计模式中工厂模式详细介绍

工厂模式:由工厂类根据参数来决定创建出哪一种产片类的实例工厂类:一个专门用来创建其他对象的方法类.即按需分配,传入参数进行选择,返回具体的类作用:对象创建的封装.简化创建对象的操作,即调用工厂类的一个方法来得到需要的类补充:1.主要角色:抽象产品(Product).具体产品(Concrete Product).抽象工厂角色(Creator)2.优缺点    优点:工厂方法模式可以允许系统在不修改工厂角色的情况下引进心产品    缺点:客户可能仅仅为了创建一个特定的Concrete Product

php设计模式 Factory(工厂模式)

复制代码 代码如下: <?php /** * 工厂方法模式 * * 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,使用一个类的实例化延迟到其子类 */ /* class DBFactory { public static function create($type) { swtich($type) { case "Mysql": return new MysqlDB(); break; case "Postgre": return new Postg

php 设计模式之 工厂模式

本人常用mysql数据库,所以程序只写了mysql的数据库操作类.希望各位高手把另外的类写全,最好能发一份给我. db_mysql.php继承db.php接口,具体实现数据库操作的各种方法 ,如果你确定你的数据库平台不会变的话不用工厂类,直接用这个就行了. 复制代码 代码如下: <?php /** * @author 黄建文 * @version V1.0 * @email hjwtp2005@qq.com * @data 2008-12-16 * =======================

PHP最常用的2种设计模式工厂模式和单例模式介绍

1.工厂模式 主要作用是降低耦合度. 复制代码 代码如下: abstract class Operation{ abstract public function getValue($num1,$num2); public function getAttr(){ return 1; } } class Add extends Operation{ public function getValue($num1, $num2){ return $num1+$num2; } } class Sub ex

介绍php设计模式中的工厂模式

问题 你如何能轻松方便地建立这么" 复杂 " 的对象即操作中不需要粘贴复制呢? 解决方法 建立一个工厂(一个函数或一个类方法)来制造新的对象.为了理解工厂的用处, 试想以下的不同之处-- 代码: 复制代码 代码如下: $connection =& new MySqlConnection($user, $password, $database); --使你的代码可扩展和更简洁-- 复制代码 代码如下: $connection =& create_connection();

学习php设计模式 php实现工厂模式(factory)

一.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使用一个类的实例化延迟到其子类[GOF95] 二.工厂模式结构图 三.工厂模式中主要角色 抽象产品(Product)角色:具体产品对象共有的父类或接口 具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例 抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Prod

PHP实现设计模式中的抽象工厂模式详解

抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个 具体的工厂类. [意图] 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] [抽象工厂模式结构图] [抽象工厂模式中主要角色] 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类

详解iOS应用开发中使用设计模式中的抽象工厂模式

概述 我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了"开放-关闭原则":工厂方法模式克服了简单工厂模式的缺点,将产品的创建工作放到具体的工厂类,每个工厂类负责生成一个产品.但是在实际应用中,一个工厂类只创建单个产品的情况很少,一般一个工厂类会负责创建一系列相关的产品,如果我们要设计这样的系统,工厂方法模式显然不能满足应用的需求,本章要介绍的抽象工厂模式,可以很好地解决一系列产品创建的问题. 定义 "提供一个创建一系列相关或相互依赖对象的接口,而无需指定

解析iOS应用开发中对设计模式中的抽象工厂模式的实现

概述 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构.那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式.这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品. 通过使用抽象工厂模式,可以处理具有相同(或者相似)等级结构中的多个产品族中的产品对象的创建问题.如下图所示: 根据产品角色的结构图,就不难给出工厂角色的结构设计图. 可以

Android编程设计模式之抽象工厂模式详解

本文实例讲述了Android编程设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定都是具体的,也就是说每个工厂都会生产某一种具体的产品,那么抽象工厂意味着生产出来的产品是不确定的,那这岂不是很奇怪?抽象工厂模式起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现

PHP中单例模式与工厂模式详解

单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式. 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 我用php大部分操作都是和各种数据库打交道,包括mysql,redis,memcache等各种关系型和非关系型数据库,所以一个应用中会 存在大量连接数据库的操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都 是对数据库的一种极

举例讲解Python设计模式编程中对抽象工厂模式的运用

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 优点:易于交换"产品系列",只要更改相应的工厂即可. 缺点:建立产品的时候很繁琐,需要增加和修改很多东西. 优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类. 优化2:为了减少简单工厂类里面的逻辑判断,可以采用"反射"机制,直接根据外部的配置文件读取出需要使用产品类的信息. #encoding=utf-8 # #by panda #抽象工厂模式 def p

学习php设计模式 php实现抽象工厂模式

抽象工厂模式(Abstact Factory)是一种常见的软件设计模式.该模式为一个产品族提供了统一的创建接口.当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类. 一.意图 抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类[GOF95] 二.抽象工厂模式结构图 三.抽象工厂模式中主要角色 抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口.通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类.

C# 设计模式系列教程-抽象工厂模式

1. 概述 抽象工厂模式为一个产品家族提供了统一的创建接口.当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别. 2. 抽象工厂模式中的角色 2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的. 2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例.这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的. 2.3 抽象产品

Java中的抽象工厂模式_动力节点Java学院整理

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类.

实例解析Java单例模式编程中对抽象工厂模式的运用

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别         抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同