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

Php设计模式之工厂模式(一)简单工厂模式

2013-04-03 11:07 756 查看
参考地址:http://blog.csdn.net/uuleaf/article/details/7572509

案例

黑枣克隆公司是专门批量生产克隆狗的一家企业。当克隆出一只黑狗的实现代码如下

<实现代码>

[php]
view plaincopy

class DogGener{
public function create($color){
if($color == 'black'){
$dog = new BlackDog();
$dog->shout();
}
if($color == 'red'){
$dog = new RedDog();
$dog->shout();
}
}
}
class BlackDog{
public function shout(){
echo "Black Wao!Wao!Wao! \n";
}
}

class RedDog
{
public function shout()
{
echo "Red Wao!Wao!Wao! \n";
}
}

$doggen = new DogGener();
$doggen->create('black');



分析OOA:

软件工程师发现,DogGener类的create方法随着Dog各类不断扩充而变得难以维护。DogGener类目前是依赖于大量的Dog类,并且将DogGener类与Dog类紧密耦合。这些类之前相互通信,但我们并不希望它们绑定在一起。

面向对象设计强调“抽象类高于实现”。也就是说,我们尽量一般化而不是特殊化。工厂方法解决了当你的代码关注于抽象类型时如何创建对象实例的问题。我们使用特定的类来处理实例化。我们先来使用简单工厂方法(Simple Factory);

设计OOD:

<UML>



<说明>

1. 抽象类Dog为狗的基类,定义所有Dog都应该实现shout方法

2. RedDog、BlackDog为Dog类的特化

3. SimpleDogFactory为简单工厂类,定义了静态方法create,接受color参数创建并返回Dog实例

编程 OOP:

<代码>

[php]
view plaincopy

abstract class Dog{
abstract function shout();
}

class RedDog extends Dog
{
public function shout()
{
echo "Red Wao!Wao!Wao! \n";
}
}

class BlackDog extends Dog
{
public function shout()
{
echo "Black Wao!Wao!Wao! \n";
}
}

class SimpleDogFactory{
public static function create($color){
$dogtype = ucfirst( strtolower($color)).'Dog';
if(class_exists($dogtype)){
return new $dogtype();
}
}
}

测试用例Test Case:

<代码>

[php]
view plaincopy

class testDriver
{
public function run()
{
//生产一条黑狗
$dog = SimpleDogFactory::create('black');
$dog->shout();
//生产一条红狗
$dog = SimpleDogFactory::create('red');
$dog->shout();
}
}

$test = new testDriver();
$test->run();

<输出>



小结:

我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。

当需要生产一只狗的时候,只需要通知工厂类SimpleDogFactory狗的颜色Color就可以了。具体的生产过程全封装在SimpleDogFactory中,所以对产品部分来说,它是符合开闭原则的。

但是工厂部分好像不太理想,因为每增加个类狗,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员

于是工厂方法模式作为救世主出现了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: