记得前面写过一篇简单工厂模式,那个是只针对一类产品的抽象,比如数据库一类的抽象;今天讲的是简单工厂模式的升级版!--抽象工厂模式。
抽象工厂模式其实就是简单工厂模式的一个再一次的抽象而已;这次把比如:汽车工厂和衣服工厂再进行一次抽象,就是抽象工厂模式了!
<?php
/**
* 汽车工厂类
*/
interface AbstractProductCart {
/**
* 取得产品名
*/
public function getName();
}
/**
* 服装工厂类
*/
interface AbstractProductFuZhuang{
/**
* 取得产品名
*/
public function getName();
}
/**
* 汽车工厂类 之 奔驰类
*/
class BenChi implements AbstractProductCart {
private $_name;
public function __construct() {
$this->_name = '奔驰';
}
public function getName() {
return $this->_name;
}
}
/**
* 汽车工厂类 之 宝马类
*/
class BaoMa implements AbstractProductCart{
private $_name;
public function __construct() {
$this->_name = '宝马';
}
public function getName() {
return $this->_name;
}
}
/**
* 服装工厂类 之 李宁类
*/
class LiNing implements AbstractProductFuZhuang {
private $_name;
public function __construct() {
$this->_name = '李宁';
}
public function getName() {
return $this->_name;
}
}
/**
* 服装工厂类 之 安踏
*/
class AnTa implements AbstractProductFuZhuang {
private $_name;
public function __construct() {
$this->_name = '安踏'
}
public function getName() {
return $this->_name;
}
}
/**
* 抽象工厂
*/
interface AbstractFactory {
/**
* 创建等级结构为 (奔驰、李宁....) 的产品的工厂方法
*/
public function createProductA();
/**
* 创建等级结构为 (宝马、安踏.....) 的产品的工厂方法
*/
public function createProductB();
}
/**
* 具体 汽车 工厂
*/
class ConcreteFactory implements AbstractFactory{
//制作奔驰
public function createProductA() {
return new BenChi();
}
//制作宝马
public function createProductB() {
return new BaoMa();
}
}
/**
* 具体 服装 工厂
*/
class ConcreteFactory2 implements AbstractFactory{
//制作李宁
public function createProductA() {
return new LiNing();
}
//制作安踏
public function createProductB() {
return new AnTa();
}
}
/**
* 客户端
*/
class Client {
/**
* 跑 汽车工厂 和 服装工厂
*/
public static function main() {
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::main();//打印数据 奔驰 宝马 李宁 安踏
?>
本文介绍了抽象工厂模式,它是简单工厂模式的扩展,通过汽车和服装工厂的抽象,展示了如何创建不同等级结构的产品。示例代码中实现了奔驰、宝马、李宁和安踏等具体产品的创建,客户端通过抽象工厂接口调用相应方法获取产品。

1558

被折叠的 条评论
为什么被折叠?



