工厂模式的作用: 创建一个实例化对象
工厂模式的优点: 给你的系统带来更大的可扩展性和尽可能少的修改量
例子:
<?php
4 class Calc{
5 public function calculate($num1,$num2,$operator){
6 try {
7 $result=0;
8 switch ($operator){
9 //......省略......
10 case '%':
11 $result= $num1%$num2;
12 break;
13 //......省略......
14 }
15 }catch (Exception $e){
16 echo "您输入有误:".$e->getMessage();
17 }
18 }
19 }
20 ?>
或者
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
} //写接口
在设计模式中,工厂模式有三种,即:简单工厂模式、工厂方法模式和抽象工厂模式。那么,为什么取名叫叫工厂呢?我们都知道,工厂是生产产品的地方。给这些设计模式取名工厂的意思也就是告诉大家,这三种模式其实就是为了生产产品(即创建对象)。而且,这三者之中,以简单工厂最为简单(有点废话了)。
那么,什么是简单工厂呢?简单工厂就是,告诉工厂我要生产的产品的名字,你给我生产出相应的产品出来(即告诉对象名,创建对象)。举个例子,有一个玩具工厂,有很多车间,可以生产狗,熊,猫三种玩具。那么,我们有如下定位:
- class DogToy
- {
- }
- class CatToy {
- }
- class BearToy
- {
- }
- class FactoryManager
- {
- public function make()
- {
- }
- }
- class FactoryManager
- {
- //你让我生产什么,告诉我玩具的名字就可以了
- public static function make($toyName)
- {
- switch ($toyName) {
- case "cat":
- return new CatToy();
- case "bear":
- return new BearToy();
- case "dog":
- return new DogToy();
- }
- }
- }
如果领导告诉我们,需要生产驴玩具,但我们生产不了这种玩具。那得告诉领导吧。所以我们需要存一份我们能生成的列表。另外,我们需要稍微整理一下。因为要生产的玩具名称和类名很有规律(玩具名首字母大写后加一个Toy就可以了)。于是有如下代码:
- class DogToy
- {
- }
- class CatToy
- {
- }
- class BearToy
- {
- }
- class FactoryManager
- {
- //指定我们工厂可以生产的玩具类型
- public static $allowToyName = array(
- "bear", "cat", "dog"
- );
- //你让我生产什么,告诉我玩具的名字就可以了
- public static function make($toyName)
- {
- //检查这种玩具是否能生产
- $toyName = strtolower($toyName);
- if (!in_array($toyName, self::$allowToyName)) {
- throw new Exception("没法生产这种玩具");
- }
- //生产玩具
- $className = ucfirst($toyName).'Toy';
- return new $className();
- }
- }
看完文章再回头来看下这张图,效果会比较好