php设计模式 — 简单工厂模式(静态工厂方法模式),php设计模式
php设计模式 — 简单工厂模式(静态工厂方法模式),php设计模式
概念
简单工厂模式 【静态工厂方法模式】(Static Factory Method)
是类的创建模式
工厂模式的几种形态:
1、简单工厂模式(Simple Factory) |又叫做 静态工厂方法模式(Static Factory Method)
2、工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory)
3、抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit)
配图
代码实例
直接将代码运行即可,都是测试过的
1 php 2 3 /** 4 * 一个事例 5 * 6 * 一个农场,要向市场销售水果 7 * 农场里有三种水果 苹果、葡萄 8 * 我们设想:1、水果有多种属性,每个属性都有不同,但是,他们有共同的地方 | 生长、种植、收货、吃 9 * 2、将来有可能会增加新的水果、我们需要定义一个接口来规范他们必须实现的方法 10 * 3、我们需要获取某个水果的类,要从农场主那里去获取某个水果的实例,来知道如何生长、种植、收货、吃 11 */ 12 13 14 /** 15 * 虚拟产品接口类 16 * 定义好需要实现的方法 17 */ 18 19 interface fruit{ 20 21 /** 22 * 生长 23 */ 24 public function grow(); 25 26 /** 27 * 种植 28 */ 29 public function plant(); 30 31 /** 32 * 收获 33 */ 34 public function harvest(); 35 36 /** 37 * 吃 38 */ 39 public function eat(); 40 41 } 42 43 44 /** 45 * 定义具体产品类 苹果 46 * 首先,我们要实现所继承的接口所定义的方法 47 * 然后定义苹果所特有的属性,以及方法 48 */ 49 class apple implements fruit{ 50 51 //苹果树有年龄 52 private $treeAge; 53 54 //苹果有颜色 55 private $color; 56 57 public function grow(){ 58 echo "grape grow"; 59 } 60 61 public function plant(){ 62 echo "grape plant"; 63 } 64 65 public function harvest(){ 66 echo "grape harvest"; 67 } 68 69 public function eat(){ 70 echo "grape eat"; 71 } 72 73 //取苹果树的年龄 74 public function getTreeAge(){ 75 return $this->treeAge; 76 } 77 78 //设置苹果树的年龄 79 public function setTreeAge($age){ 80 $this->treeAge = $age; 81 return trie; 82 } 83 84 } 85 86 /** 87 * 定义具体产品类 葡萄 88 * 首先,我们要实现所继承的接口所定义的方法 89 * 然后定义葡萄所特有的属性,以及方法 90 */ 91 class grape implements fruit{ 92 93 94 //葡萄是否有籽 95 private $seedLess; 96 97 public function grow(){ 98 echo "apple grow"; 99 } 100 101 public function plant(){ 102 echo "apple plant"; 103 } 104 105 public function harvest(){ 106 echo "apple harvest"; 107 } 108 109 public function eat(){ 110 echo "apple eat"; 111 } 112 113 //有无籽取值 114 public function getSeedLess(){ 115 return $this->seedLess; 116 } 117 118 //设置有籽无籽 119 public function setSeedLess($seed){ 120 $this->seedLess = $seed; 121 return true; 122 } 123 124 } 125 126 127 /** 128 *农场主类 用来获取实例化的水果 129 * 130 */ 131 class farmer{ 132 133 //定义个静态工厂方法 134 public static function factory($fruitName){ 135 switch ($fruitName) { 136 case 'apple': 137 return new apple(); 138 break; 139 case 'grape': 140 return new grape(); 141 break; 142 default: 143 throw new badFruitException("Error no the fruit", 1); 144 break; 145 } 146 } 147 } 148 149 class badFruitException extends Exception{ 150 public $msg; 151 public $errType; 152 public function __construct($msg = '' , $errType = 1){ 153 $this->msg = $msg; 154 $this->errType = $errType; 155 } 156 } 157 158 159 /** 160 * 获取水果实例化的方法 161 */ 162 try{ 163 $appleInstance = farmer::factory('apple'); 164 var_dump($appleInstance); 165 }catch(badFruitException $err){ 166 echo $err->msg . "_______" . $err->errType; 167 }
Example #1 调用工厂方法(带参数)
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Driver not found');
}
}
}
?>
------------------------------------
Example #2 单例模式
class Example
{
// 保存类实例在此属性中
private static $instance;
// 构造方法声明为private,防止直接创建对象
private function __construct()
{
echo 'I am constructed';
}
// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example类中的普通方法
public function bark()
{
echo 'Woof!';
}
// 阻止用户复制对象实例
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
建议LZ把简单工厂,工厂方法和抽象工厂一起研究下,呵呵,前一段我老师让我研究下这3种模式的不同,一起学习可能更明白了。
简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
先来看看它的组成:
1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
看下它的组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。