php 八大设计模式-工厂模式
作用:提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤,实际上就是建立一个统一的类实例化的函数接口,完成统一调用,统一控制。
工厂模式也分为三种:
- 工厂模式
- 抽象工厂模式
工厂模式
<?php
// 接口
interface ToData {
public function goData();
}
//字符串类
class String implements ToData {
public function goData() {
// todo
}
}
//Json类
class Json implements ToData {
public function goData() {
// todo
}
}
//xml类
class Xml implements ToData {
public function goData() {
// todo
}
}
//工厂类
class Factory {
public static function create($class) {
return new $class;
}
}
$typeClass = Factory::create('String');
$typeClass->goData();
?>
抽象工厂
<?php
/**
* 抽象产品A
*/
interface AbstractProductA {
/**
* 取得产品名
*/
public function getName();
}
/**
* 抽象产品B
*/
interface AbstractProductB {
/**
* 取得产品名
*/
public function getName();
}
/**
* 具体产品A1
*/
class ProductA1 implements AbstractProductA {
private $_name;
public function __construct() {
$this->_name = 'product A1';
}
public function getName() {
return $this->_name;
}
}
/**
* 具体产品A2
*/
class ProductA2 implements AbstractProductA {
private $_name;
public function __construct() {
$this->_name = 'product A2';
}
public function getName() {
return $this->_name;
}
}
/**
* 具体产品B1
*/
class ProductB1 implements AbstractProductB {
private $_name;
public function __construct() {
$this->_name = 'product B1';
}
public function getName() {
return $this->_name;
}
}
/**
* 具体产品B2
*/
class ProductB2 implements AbstractProductB {
private $_name;
public function __construct() {
$this->_name = 'product B2';
}
public function getName() {
return $this->_name;
}
}
/**
* 抽象工厂
*/
interface AbstractFactory {
/**
* 创建等级结构为A的产品的工厂方法
*/
public function createProductA();
/**
* 创建等级结构为B的产品的工厂方法
*/
public function createProductB();
}
/**
* 具体工厂1
*/
class ConcreteFactory1 implements AbstractFactory{
public function createProductA() {
return new ProductA1();
}
public function createProductB() {
return new ProductB1();
}
}
/**
* 具体工厂2
*/
class ConcreteFactory2 implements AbstractFactory{
public function createProductA() {
return new ProductA2();
}
public function createProductB() {
return new ProductB2();
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function index() {
self::run(new ConcreteFactory1());
self::run(new ConcreteFactory2());
}
/**
* 调用工厂实例生成产品,输出产品名
* @param $factory AbstractFactory 工厂实例
*/
public static function run(AbstractFactory $factory) {
$productA = $factory->createProductA();
$productB = $factory->createProductB();
echo $productA->getName(), '<br />';
echo $productB->getName(), '<br />';
}
}
// 客户端执行
Client::index();
?>