php简单工厂模式,工厂方法模式和抽象工厂模式比较
2016-06-06 17:20
706 查看
PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
根据抽象程度不同,PHP工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式
通常工厂模式有一个关键的构造,即一般被命名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象。
基本的工厂类:
利用工厂类生产对象:
简单工厂模式:
/**
*简单工厂模式与工厂方法模式比较。
*简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。
*/
interface people {
function jiehun();
}
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!<br>';
}
}
class women implements people {
function jiehun() {
echo '穿婚纱!<br>';
}
}
class SimpleFactoty {
// 简单工厂里的静态方法
static function createMan() {
return new man;
}
static function createWomen() {
return new women;
}
}
$man = SimpleFactoty::createMan();
$man->jiehun();
$man = SimpleFactoty::createWomen();
$man->jiehun();
工厂方法模式:
<?php
/*
*工厂方法模式:
*定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。<www.phpddt.com整理>
*/
interface people {
function jiehun();
}
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!<br>';
}
}
class women implements people {
function jiehun() {
echo '穿婚纱!<br>';
}
}
interface createMan { // 注意了,这里是简单工厂本质区别所在,将对象的创建抽象成一个接口。
function create();
}
class FactoryMan implements createMan{
function create() {
return new man;
}
}
class FactoryWomen implements createMan {
function create() {
return new women;
}
}
class Client {
// 简单工厂里的静态方法
function test() {
$Factory = new FactoryMan;
$man = $Factory->create();
$man->jiehun();
$Factory = new FactoryWomen;
$man = $Factory->create();
$man->jiehun();
}
}
$f = new Client;
$f->test();
抽象工厂模式:
<?php
/*
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?
*/
interface people {
function jiehun();
}
class Oman implements people{
function jiehun() {
echo '美女,我送你玫瑰和戒指!<br>';
}
}
class Iman implements people{
function jiehun() {
echo '我偷偷喜欢你<br>';
}
}
class Owomen implements people {
function jiehun() {
echo '我要穿婚纱!<br>';
}
}
class Iwomen implements people {
function jiehun() {
echo '我好害羞哦!!<br>';
}
}
interface createMan { // 注意了,这里是本质区别所在,将对象的创建抽象成一个接口。
function createOpen(); //分为 内敛的和外向的
function createIntro(); //内向
}
class FactoryMan implements createMan{
function createOpen() {
return new Oman;
}
function createIntro() {
return new Iman;
}
}
class FactoryWomen implements createMan {
function createOpen() {
return new Owomen;
}
function createIntro() {
return new Iwomen;
}
}
class Client {
// 简单工厂里的静态方法
function test() {
$Factory = new FactoryMan;
$man = $Factory->createOpen();
$man->jiehun();
$man = $Factory->createIntro();
$man->jiehun();
$Factory = new FactoryWomen;
$man = $Factory->createOpen();
$man->jiehun();
$man = $Factory->createIntro();
$man->jiehun();
}
}
$f = new Client;
$f->test();
区别:
简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力
工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法
适用范围:
简单工厂模式:
工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。
工厂方法模式:
当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。
抽象工厂模式:
一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。
转载地址: http://www.phpddt.com/php/php-factory.html
根据抽象程度不同,PHP工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式
通常工厂模式有一个关键的构造,即一般被命名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象。
基本的工厂类:
<?php
02 | class Fruit { |
03 | // 对象从工厂类返回 |
04 | } |
05 |
06 | Class FruitFactory { |
07 |
08 | public static function factory() { |
09 | // 返回对象的一个新实例 |
10 | return new Fruit(); |
11 | } |
12 | } |
13 |
14 | // 调用工厂 |
15 | $instance = FruitFactory::factory(); |
<?php
02 | class Example |
03 | { |
04 | // The parameterized factory method |
05 | public static function factory( $type ) |
06 | { |
07 | if ( include_once 'Drivers/' . $type . '.php' ) { |
08 | $classname = 'Driver_' . $type ; |
09 | return new $classname ; |
10 | } else { |
11 | throw new Exception( 'Driver not found' ); |
12 | } |
13 | } |
14 | } |
15 | // Load a MySQL Driver |
16 | $mysql = Example::factory( 'MySQL' ); |
17 | // Load an SQLite Driver |
18 | $sqlite = Example::factory( 'SQLite' ); |
19 | ?> |
/**
*简单工厂模式与工厂方法模式比较。
*简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。
*/
interface people {
function jiehun();
}
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!<br>';
}
}
class women implements people {
function jiehun() {
echo '穿婚纱!<br>';
}
}
class SimpleFactoty {
// 简单工厂里的静态方法
static function createMan() {
return new man;
}
static function createWomen() {
return new women;
}
}
$man = SimpleFactoty::createMan();
$man->jiehun();
$man = SimpleFactoty::createWomen();
$man->jiehun();
工厂方法模式:
<?php
/*
*工厂方法模式:
*定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。<www.phpddt.com整理>
*/
interface people {
function jiehun();
}
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!<br>';
}
}
class women implements people {
function jiehun() {
echo '穿婚纱!<br>';
}
}
interface createMan { // 注意了,这里是简单工厂本质区别所在,将对象的创建抽象成一个接口。
function create();
}
class FactoryMan implements createMan{
function create() {
return new man;
}
}
class FactoryWomen implements createMan {
function create() {
return new women;
}
}
class Client {
// 简单工厂里的静态方法
function test() {
$Factory = new FactoryMan;
$man = $Factory->create();
$man->jiehun();
$Factory = new FactoryWomen;
$man = $Factory->create();
$man->jiehun();
}
}
$f = new Client;
$f->test();
抽象工厂模式:
<?php
/*
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?
*/
interface people {
function jiehun();
}
class Oman implements people{
function jiehun() {
echo '美女,我送你玫瑰和戒指!<br>';
}
}
class Iman implements people{
function jiehun() {
echo '我偷偷喜欢你<br>';
}
}
class Owomen implements people {
function jiehun() {
echo '我要穿婚纱!<br>';
}
}
class Iwomen implements people {
function jiehun() {
echo '我好害羞哦!!<br>';
}
}
interface createMan { // 注意了,这里是本质区别所在,将对象的创建抽象成一个接口。
function createOpen(); //分为 内敛的和外向的
function createIntro(); //内向
}
class FactoryMan implements createMan{
function createOpen() {
return new Oman;
}
function createIntro() {
return new Iman;
}
}
class FactoryWomen implements createMan {
function createOpen() {
return new Owomen;
}
function createIntro() {
return new Iwomen;
}
}
class Client {
// 简单工厂里的静态方法
function test() {
$Factory = new FactoryMan;
$man = $Factory->createOpen();
$man->jiehun();
$man = $Factory->createIntro();
$man->jiehun();
$Factory = new FactoryWomen;
$man = $Factory->createOpen();
$man->jiehun();
$man = $Factory->createIntro();
$man->jiehun();
}
}
$f = new Client;
$f->test();
区别:
简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力
工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法
适用范围:
简单工厂模式:
工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。
工厂方法模式:
当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。
抽象工厂模式:
一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。
转载地址: http://www.phpddt.com/php/php-factory.html
相关文章推荐
- ftp配置文件
- laravel从git上拉取下来一个新的项目的时候,需要注意的
- PHP Socket实现websocket(四)Select函数
- Laravel——路由(路由与控制器)
- Zend Studio for Eclipse的java.lang.NullPointerExcep
- phpexcel读写excel表格详解
- PHP数组与xml之间的转换
- GetProcessMemoryInfo
- yii2数据库增删改查询操作
- PHP之Yii框架学习总结
- hotplug运行流程
- php 使用curl模拟登录人人(校内)网的简单实例
- php-fpm 启动参数及重要配置详解
- OutputCache缓存各参数的说明
- PHP基础-数据类型和运算符
- CodeIgniter-3.0.0 Unable to locate the specified class: Session.php
- php header 无法跳转的问题
- editplus配置笔记(新建文件模板、代码美化、PHP手册、函数自动完成)
- 在线PHP解密(威盾)工具
- PHP json_encode中文乱码解决方法