概念

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

根据抽象程度的不同,PHP工厂模式分为三种:

  1. 简单工厂模式

  2. 工厂方法模式

  3. 抽象工厂模式

讲解

简单工厂模式

简单工厂模式又称静态工厂方法模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。

代码示例:

<?php
header('Content-Type:text/html;charset=utf-8');
/**
*简单工厂模式(静态工厂方法模式)
*/ /**
* Interface people 人类
*/
interface people
{
public function say();
} /**
* Class man 继承people的男人类
*/
class man implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是男人<br>';
}
} /**
* Class women 继承people的女人类
*/
class women implements people
{
// 具体实现people的say方法
public function say()
{
echo '我是女人<br>';
}
} /**
* Class SimpleFactoty 工厂类
*/
class SimpleFactoty
{
// 简单工厂里的静态方法-用于创建男人对象
static function createMan()
{
return new man();
} // 简单工厂里的静态方法-用于创建女人对象
static function createWomen()
{
return new women();
} } /**
* 具体调用
*/
$man = SimpleFactoty::createMan();
$man->say();
$woman = SimpleFactoty::createWomen();
$woman->say();

运行结果:

我是男人
我是女人

工厂方法模式

定义一个用于创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。

看代码:

<?php
header('Content-type:text/html;charset=utf-8');
/*
*工厂方法模式
*/ /**
* Interface people 人类
*/
interface people
{
public function say();
} /**
* Class man 继承people的男人类
*/
class man implements people
{
// 实现people的say方法
function say()
{
echo '我是男人-hi<br>';
}
} /**
* Class women 继承people的女人类
*/
class women implements people
{
// 实现people的say方法
function say()
{
echo '我是女人-hi<br>';
}
} /**
* Interface createPeople 创建人物类
* 注意:与上面简单工厂模式对比。这里本质区别在于,此处是将对象的创建抽象成一个接口。
*/
interface createPeople
{
public function create(); } /**
* Class FactoryMan 继承createPeople的工厂类-用于实例化男人类
*/
class FactoryMan implements createPeople
{
// 创建男人对象(实例化男人类)
public function create()
{
return new man();
}
} /**
* Class FactoryMan 继承createPeople的工厂类-用于实例化女人类
*/
class FactoryWomen implements createPeople
{
// 创建女人对象(实例化女人类)
function create()
{
return new women();
}
} /**
* Class Client 操作具体类
*/
class Client
{
// 具体生产对象并执行对象方法测试
public function test() {
$factory = new FactoryMan();
$man = $factory->create();
$man->say(); $factory = new FactoryWomen();
$man = $factory->create();
$man->say();
}
} // 执行
$demo = new Client;
$demo->test();

看结果:

我是男人-hi
我是女人-hi

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口。

注意:这里和工厂方法的区别是:一系列(多个),而工厂方法只有一个。

代码:

<?php
header('Content-type:text/html;charset=utf-8');
/*
* 抽象工厂模式
*/ /**
* Interface people 人类
*/
interface people
{
public function say();
} /**
* Class OneMan 第一个男人类-继承people
*/
class OneMan implements people
{
// 实现people的say方法
public function say()
{
echo '男1:我喜欢你<br>';
}
} /**
* Class TwoMan 第二个男人类-继承people
*/
class TwoMan implements people{
// 实现people的say方法
public function say()
{
echo '男2:我看上你了<br>';
}
} /**
* Class OneWomen 第一个女人类-继承people
*/
class OneWomen implements people {
// 实现people的say方法
public function say()
{
echo '女1:我不喜欢你<br>';
}
} /**
* Class TwoWomen 第二个女人类-继承people
*/
class TwoWomen implements people {
// 实现people的say方法
public function say()
{
echo '女2:滚一边玩去<br>';
}
} /**
* Interface createPeople 创建对象类
* 注意:这里将对象的创建抽象成了一个接口。
*/
interface createPeople
{
// 创建第一个
public function createOne();
// 创建第二个
public function createTwo(); } /**
* Class FactoryMan 用于创建男人对象的工厂类-继承createPeople
*/
class FactoryMan implements createPeople
{
// 创建第一个男人
public function createOne()
{
return new OneMan();
} // 创建第二个男人
public function createTwo()
{
return new TwoMan();
}
} /**
* Class FactoryWomen 用于创建女人对象的工厂类-继承createPeople
*/
class FactoryWomen implements createPeople
{
// 创建第一个女人
public function createOne()
{
return new OneWomen();
} // 创建第二个女人
public function createTwo()
{
return new TwoWomen();
}
} /**
* Class Client 执行测试类
*/
class Client { // 具体生成对象和执行方法
public function test() {
// 男人
$factory = new FactoryMan();
$man = $factory->createOne();
$man->say(); $man = $factory->createTwo();
$man->say(); // 女人
$factory = new FactoryWomen();
$man = $factory->createOne();
$man->say(); $man = $factory->createTwo();
$man->say(); }
} // 执行
$demo = new Client;
$demo->test();

结果:

男1:我喜欢你
男2:我看上你了
女1:我不喜欢你
女2:滚一边玩去

总结

区别

  1. 简单工厂模式(静态方法工厂模式) : 用来生产同一等级结构中的任意产品。(不能增加新的产品)

  2. 工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

  3. 抽象工厂 :用来生产不同产品种类的全部产品。(不能增加新的产品,支持增加产品种类)

适用范围

简单工厂模式:

工厂类负责创建的对象较少,操作时只需知道传入工厂类的参数即可,对于如何创建对象过程不用关心。

工厂方法模式:

满足以下条件时,可以考虑使用工厂模式方法

  1. 当一个类不知道它所必须创建对象的类时

  2. 一个类希望由子类来指定它所创建的对象时

  3. 当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时

抽象工厂模式:

满足以下条件时,可以考虑使用抽象工厂模式

  1. 系统不依赖于产品类实例如何被创建,组合和表达的细节。

  2. 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

  3. 同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来。

  4. 系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。

以上几种,归根结底,都是将重复的东西提取出来,以方便整体解耦和复用,修改时方便。可根据具体需求而选择使用。

PHP设计模式之工厂模式(转)的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. [洛谷 P1559] 运动员最佳匹配问题

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  2. 64位Ubuntu下配置CP-ABE环境

    CP-ABE环境配置 本文密码学专业,论文仿真需要CP-ABE,现将配置过程作个记录 cpabe依赖pbc,pbc依赖gmp,gmp依赖M4.bison.flex,所以.. sudo apt-get  ...

  3. Linux五种IO模型(同步 阻塞概念)

    Linux五种IO模型 同步和异步 这两个概念与消息的通知机制有关. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.比如,调用readfrom系统调用时,必须等待IO操 ...

  4. 通过JdbcTemplate编写数据访问(二十八)

    数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. 首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置: 1 2 3 4 < ...

  5. java下使用chromedriver获取访问页面状态码

    ##在使用chromedriver的时候 并没有提供api来获取访问页面的状态码,但是可以打开日志来获取到 LoggingPreferences logPrefs = new LoggingPrefe ...

  6. WinForm之窗体应用程序

    WinForm之窗体应用程序 基本简单数据库操作(增删改查) using System; using System.Collections.Generic; using System.Windows. ...

  7. python常用

    列出当前目录 import os: print os.getcwd() python load .mat variable a import scipy.io as sp tmp=sp.loadmat ...

  8. Win10系列:UWP界面布局进阶2

    为了让用户可以在流畅浏览应用界面的同时提供与应用相关的功能按钮,Windows 10系统在用户界面当中引入了侧边栏,侧边栏可以在用户有需要对应用或者系统进行操作时显示,在没有需要操作的时候自动隐藏,并 ...

  9. Win10系列:UWP界面布局基础11

    样式继承 为了使样式便于维护及重复使用,可以在一个样式上引用其他的样式,这就是样式继承.样式继承的方法是:在Style元素的BasedOn属性上使用StaticResource标记扩展来引用被继承的样 ...

  10. SQLServer中sql for xml path 的用法

    我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...