一、什么是工厂方法模式

  作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”。对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。利用工厂方法模式,请求者只发出请求,而不具体创建产品。

二、什么时候使用工厂方法模式

  如果实例化对象的子类可能改变,就要使用工厂方法模式。

三、一般工厂方法模式

  使用一般工厂方法模式时,客户只包含工厂的引用,一个工厂生产一种产品。增加一种产品的同时需要增加一个新工厂类和一个新产品类。

<?php
/**
* 一般工厂方法设计模式
**/ //工厂抽象类
abstract class Factory
{
protected abstract function produce(); public function startFactory()
{
$pro = $this->produce();
return $pro;
}
} //文本工厂
class TextFactory extends Factory
{
protected function produce()
{
$textProduct = new TextProduct();
return $textProduct->getProperties();
}
} //图像工厂
class ImageFactory extends Factory
{
protected function produce()
{
$imageProduct = new ImageProduct();
return $imageProduct->getProperties();
}
} //产品类接口
interface Product
{
public function getProperties();
} //文本产品
class TextProduct implements Product
{
private $text; function getProperties()
{
$this->text = "此处为文本";
return $this->text;
}
} //图像产品
class ImageProduct implements Product
{
private $image; function getProperties()
{
$this->image = "此处为图像";
return $this->image;
}
} //客户类
class Client
{
private $textFactory;
private $imageFactory; public function __construct()
{
$this->textFactory = new TextFactory();
echo $this->textFactory->startFactory() . '<br />'; $this->imageFactory = new ImageFactory();
echo $this->imageFactory->startFactory() . '<br />';
}
} $client = new Client();
?>

  

四、参数化工厂方法模式

  使用参数化工厂方法模式时,客户包含工厂和产品的引用,发出请求时需要指定产品的种类,一个工厂生产多种产品。增加一种产品时只需要增加一个新产品类即可。

<?php
/**
* 参数化工厂方法设计模式
**/ //工厂抽象类
abstract class Factory
{
protected abstract function produce(Product $product); public function startFactory(Product $product)
{
$pro = $this->produce($product);
return $pro;
}
} //工厂实现
class ConcreteFactory extends Factory
{
protected function produce(Product $product)
{
return $product->getProperties();
}
} //产品类接口
interface Product
{
public function getProperties();
} //文本产品
class TextProduct implements Product
{
private $text; public function getProperties()
{
$this->text = "此处为文本";
return $this->text;
}
} //图像产品
class ImageProduct implements Product
{
private $image; public function getProperties()
{
$this->image = "此处为图像";
return $this->image;
}
} //客户类
class Client
{
private $factory;
private $textProduct;
private $imageProduct; public function __construct()
{
$factory = new ConcreteFactory();
$textProduct = new TextProduct();
$imageProduct = new ImageProduct(); echo $factory->startFactory($textProduct) . '<br />';
echo $factory->startFactory($imageProduct) . '<br />';
}
} $client = new Client();
?>

  

PHP设计模式一:工厂方法设计模式的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  3. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  4. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  5. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  6. 23种设计模式之工厂方法(Factory Method Pattern)

    工厂方法 前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例.在同一等级结构中,支持增加任意产品这种设 ...

  7. java设计模式之工厂方法探究

    简单工厂 + 工厂方法 + 抽象工厂       看了十几篇博客,每篇基本上都能有个自己的解释,我汇总这些内容,重新梳理整理了一番,以形成自己的理解.       简单工厂模式其实不算23种设计模式之 ...

  8. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  9. java 23 - 1 设计模式之工厂方法模式

    转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

随机推荐

  1. 关于maven项目的一些报错问题

    本文为自己记录的笔记略显粗糙后续会把遇到的问题追加进来.忘大神多指点 1.父工程红色感叹号 此类问题解决方法,一般打开pom文件查看红色标记处是否有报错,也就是看哪个jar包没有下下来.分为两种情况. ...

  2. JVM(四)内存回收(二)

    在上一节中"JVM(三)内存回收(一)"我讲到了垃圾回收的几种算法,算是解决了之前提到的3个问题中的最后一个. 关于内存回收,还应该了解常用的内存回收器(GC Collector) ...

  3. [python学习笔记] 开篇

    今天开始学习markdown,立贴为证. 平均一天一小时.两个月先学完基础. 所有的帖子只为了学习记录,有不对的请提出,轻吐槽

  4. IBAction&IBOutlet

    IB:Interface Builder 1>IBAction 需要操作,例如按钮的点击 2> IBOutlet 需要获得.修改该属性 然后就可以与Storyboard建立起联系

  5. adobe acrobat pro 9破解方法

    方法一:(经常没用,不推荐) 尝试一下部分常见序列号: 网上搜 方法二: (能找到文件的,推荐) 1.到 C:\Program Files\Common Files\Adobe\Adobe PCD\c ...

  6. shell二位数组——终端字符下降动画

    猜想:Shell支持关联数组,可以利用关联数组模拟二维数组. [验证猜想] #!/bin/bash array[1,1]=1 array[2,1]=2 array[3,1]=3 for i in `s ...

  7. MMORPG战斗系统随笔(一)

    前言 很久没有更新博客,中间迁移过一次博客,后来一直忙于项目的开发,忙的晚上回去没时间写博客,周日又要自我调整一下,所以空闲了很久没有继续写博客.最近终于慢慢放慢节奏,项目也快上线了,可以有空写一些个 ...

  8. Lowbit Sum 规律

    Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

  9. poj2155一个二维树状数组

                                                                                                         ...

  10. selenium webdriver 启动三大浏览器Firefox,Chrome,IE

    selenium webdriver 启动三大浏览器Firefox,Chrome,IE 1.安装selenium 在联网的情况下,在Windows命令行(cmd)输入pip install selen ...