### 概述
是类的创建模式,又叫做简单方法模式,静态产品模式是一个工厂对象决定创建出哪一种产品类的实例.
### 优点
使用静态工厂模式的优点是实现责任的分割,该模式的核心是工厂类,工厂类含有必要的选择逻辑,可以决定什么时候创建哪一个产品的实例,而客户端则免去直接创建产品的责任,而
仅仅是消费产品。也就是说静态工厂模式在不改变客户端代码的情况可以动态的增加产品。(总有人对静态工厂模式增加产品后客户端代码不改变存有疑问,这里指的不改变,是指原来的
消费产品的代码不必改变,您如果是要消费新的产品当然得把新的产品加上啊),也就在某种程度上满足开闭原则,但它并不完全满足开闭原则,因为没当增加新的产品时,都需要修
改工厂类,所以出现了以后的工厂方法模式。
### 为什么工厂类中的方法必须是静态的?
其实这样不用静态的在语法上并没有错误,但却完全没理解面向对象设计的精髓。
如果直接new出Factory的对象,客户端就必须自己控制工厂类的构造和生成,客户端必须非常清楚工厂的构造函数(比如构造函数有多少个参数,输入参数时有什么条件等等),也知道
工厂的内部细节,一旦工厂扩展或者改变了,客户端在没有得到通知的情况下就不知道怎么调用了。而是用静态方法构造客户端则完全不关心你是如何构造对象的所以客户端不需要了解
工厂的构造细节,一旦工厂内部发生变化,客户端也不需要关心。它只需要关心最后的结果就行了,因为所有的细节都在工厂内部被处理完了。
### 实例
~~~
/**
* 虚拟产品接口
*/
interface Fruit{
public function grow(); //生长
public function plant(); //种植
public function harvest(); //收获
public function eat(); //食用
}
/**
* 定义具体产品,实现接口
*/
class Apple implements Fruit{
private $treeAge;
private $color;
public function grow()
{
echo "apple grow";
}
public function plant()
{
echo "apple plant";
}
public function harvest()
{
echo "apple harvest";
}
public function eat()
{
echo "apple eat";
}
public function getTreeAge()
{
return $this->treeAge;
}
public function setTreeAge($age)
{
$this->treeAge = $age;
return true;
}
}
class Grape implements Fruit{
private $seedLess;
public function grow()
{
echo "grape grow";
}
public function plant()
{
echo "grape plant";
}
public function harvest()
{
echo "grape harvest";
}
public function eat()
{
echo "grape eat";
}
public function getSeedLess()
{
return $this->seedLess;
}
public function setSeedLess($seed)
{
$this->seedLess = $seed;
return true;
}
}
/**
* 定义静态工厂
*/
class Factory{
public static function create($fruitName)
{
switch($fruitName){
case "Apple":
return new Apple();
break;
case "Grape":
return new Grape();
break;
default:
throw new badFruitException("Error no the fruit");
break;
}
}
}
class badFruitException extends Exception{
public $msg;
public $errType;
public function __construct($message = "", $code = 1, Throwable $previous = null)
{
$this->msg = $message;
$this->errType = $code;
}
}
try{
$appleInstance = Factory::create("Apple");
var_dump($appleInstance);
} catch(badFruitException $err){
echo $err->msg . "--" . $err->errType;
}
~~~
- PHP加密技术
- md5加密
- Crypt加密
- 函数
- 概述
- 强类型参数
- 可变参数列表
- 值传递&引用传递
- 变量作用域
- 可变函数
- 嵌套函数
- 递归函数
- 匿名函数(闭包)
- 面向对象
- 概念
- 类
- 对象的传值
- 对象的克隆
- 构造方法
- 析构方法
- 克隆方法
- $this
- 类常量
- 静态属性
- 静态方法
- 继承
- 重写
- 重载
- 概述
- 属性重载
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重载
- 概述
- __call()
- __callstatic()
- 封装
- 最终类
- 抽象类
- 接口
- 对象的序列化与反序列化
- __sleep()
- __wakeup()
- 其他魔术方法
- 对象的遍历
- 类和对象相关函数
- 错误
- 概述
- 设置错误级别
- trigger_error()触发错误
- 处理PHP中的错误
- 异常
- 概述
- 自定义异常类
- 自定义文件写入异常类
- 记录和发送异常信息
- 使用观察者模式处理异常信息
- 自定义异常处理器
- 设计模式
- 创建型
- 单例模式
- 工厂模式
- 原型模式
- 结构型
- 注册树模式
- 适配器模式
- 数据映射模式
- 装饰器模式
- 代理模式
- 行为型
- 策略模式
- 观察者模式
- 迭代器模式
- 网络
- cURL
- Oauth2.0
- QQ第三方登录
- TCP/IP协议
- 概述
- HTTP协议
- 概述
- HTTP请求协议
- HTTP响应协议
- WebSocket
- 安装扩展
- Redis
- Socket
- 计算机通信
- socket简介
- PHP操作socket
- TCP
- HTTP服务端
- WebSocket
- PHP7
- 生成器yield
- 异常finally
- CGI和FPM
- php有用命令
- 内存