程序设计模式(二):简单工厂模式

简介:

简单工厂模式(Simple Factory)提供一个创建对象实例的功能,而无需关系其具体实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。

适用场景:

如果想完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选择简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。

如果想要把对外创建对象的职责集中管理和控制,可以选择简单工厂。

优缺点:

优点:
帮助封装:简单工厂虽然简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦:通过简单工厂,实现了客户端和具体实现类的解耦。

缺点:
可能增加客户端的复杂度
不方便扩展子工厂

类图:

实现:

IShape.php (接口,限定子类实现方法)

1
2
3
4
5
6
<?php
namespace Test;
interface IShape
{
public function draw();
}

Circle.php(具体实现类(圆形))

1
2
3
4
5
6
7
8
9
<?php
namespace Test;
class Circle implements IShape
{
public function draw()
{
return '画一个圆形';
}
}

Square.php(具体实现类(正方形))

1
2
3
4
5
6
7
8
9
<?php
namespace Test;
class Square implements IShape
{
public function draw()
{
return '画一个正方形';
}
}

Factory.php(简单工厂类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
namespace Test;

class Factory {
const CIRCLE = 'circle';
const SQUARE = 'square';
private $shape;
public function __construct($shape)
{
$this->shape = $shape;
}
public function getShape()
{
switch ($this->shape){
case self::CIRCLE:
return new Circle();
break;
case self::SQUARE:
return new Square();
break;
default:
return null;
}
}
}

客户端调用:

1
2
3
4
5
6
7
8
9
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Test/Loader.php';
spl_autoload_register('\\Test\\Loader::autoload');

use Test\Factory;
$shape = (new Factory(Factory::CIRCLE))->getShape();
$sting = $shape->draw();
echo $sting;

思考:

现在又要加一个画长方形的新需求该怎么办?