设计模式:
工厂模式,使对象有一个统一生成(实例化)的入口。
简单工厂,也称静态工厂的例子:
// Factory
class Factory
{
public static function createProduct(string $type) : Product
{
$product = null;
switch ($type) {
case 'A':
$product = new ProductA();
break;
case 'B':
$product = new ProductB();
break;
}
return $product;
}
}
产品接口和产品实现
// Products
interface Product
{
public function show();
}
class ProductA implements Product
{
public function show()
{
echo 'Show ProductA';
}
}
class ProductB implements Product
{
public function show()
{
echo 'Show ProductB';
}
}
//客户端调用
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();
工厂模式的主要优势在于,如果你不使用的话,那么你以后代码维护的时候,一旦你的原始类修改,那么每个类的名字都会被修改。但是你使用工厂模式后,只需要修改工厂模式的switch 中的一个就可以。
单例模式:
节省资源,只能够创建一个实例。四个私有,一个共有。
class Singleton{
//私有属性,用于保存实例
private static $instance;
//构造方法私有化,防止外部创建实例
private function __construct(){}
//公有属性,用于测试
public $a;
//公有方法,用于获取实例
public static function getInstance(){
//判断实例有无创建,没有的话创建实例并返回,有的话直接返回
if(!(self::$instance instanceof self)){
self::$instance = new self();
}
return self::$instance;
}
//克隆方法私有化,防止复制实例
private function __clone(){}
}
发布订阅模式
<?php
//定义Observer接口
interface Observer
{
function notify($msg);
}
//User用户实现Observer接口
class User implements Observer {
public $name;
public function __construct($name) {
$this->$name = $name;
Msg::getInstance()->register($this);
}
public function notify($msg) {
echo $this->name . ' '. 'recive msg' .$msg.'\r\n';
}
}
class Msg
{
private $obeservers = [];
private static $_instance ;
public static function getInstance()
{
if(!self::$_instance) {
self::$_instance = new self();
}
return self::$_instance;
}
public function publish($msg) {
foreach ($this->observers as $observer) {
$observer->notify($msg);
}
}
function register(Observer $o) {
$this->observers[] = $o;
}
}
$user1 = new User('xushengbin');
$user2 = new User('zhuqiaozhen');
$msg = Msg::getInstance()->publish('今天要下雨了');
参考文献:
[1] PHP设计模式之简单工厂模式 ZyBlog 硬核项目经理