您的位置:首页 > 编程语言 > PHP开发

PHP设计模式笔记:使用PHP实现工厂模式

2013-12-11 16:40 946 查看
PHP设计模式笔记:使用PHP实现工厂模式

【意图】

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】

【工厂模式结构图】




工厂方法模式

【工厂模式中主要角色】

抽象产品(Product)角色:具体产品对象共有的父类或接口

具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例

抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。

Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象

具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。

【工厂模式的优点和缺点】

工厂模式的优点


工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

工厂模式的缺点

客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类

【工厂模式适用场景】

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

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

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

【工厂模式与其它模式】
抽象工厂模式(abstract factory模式):Abstract Factory模式经常使用工厂方法来实现

Template Method模式: 工厂方法通常在Template Methods中被调用

【工厂模式PHP示例】

<?php
/*
*php 实现抽象工厂模式 abstract factory
*/

//抽象工厂
interface Creator
{
public function factoryMethod();
}

//具体工厂A
class ConcreateFactoryA implements Creator
{
public function factoryMethod()
{
//工厂方法,返回具体产品A
return new ConcreateProductA();
}
}

//具体工厂B
class ConcreateFactoryB implements Creator
{
public function factoryMethod()
{
//工厂方法,返回具体产品B
return new ConcreateProductB();
}
}

//抽象产品
interface Product
{
public function operation();
}

//具体产品A
class ConcreateProductA implements Product
{
public function operation()
{
echo "ConcreateProductA<br />";
}
}

class ConcreateProductB implements Product
{
public function operation()
{
echo "ConcreateProductB<br />";
}
}

class Client
{
public static function main()
{
$factoryA = new ConcreateFactoryA();
$productA = $factoryA -> factoryMethod();
$productA -> operation();

$factoryB = new ConcreateFactoryB();
$productB = $factoryB -> factoryMethod();
$productB -> operation();
}
}
Client::main();
?>


【工厂方法模式与简单工厂模式】

工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。

工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了”开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。

工厂方法模式退化后可以演变成简单工厂模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: