PHP设计模式之AbstractFactory模式

    技术2022-05-20  42

    通常工厂模式用来创建某类固定模式的对象,但是某些项目中我们经常要创建不同类型的对象,比如在游戏中,通常有很多角色,这时就会用的抽象工厂方法,AbstractFactory模式典型的结构图为:

     

    注释:UML连线中虚线箭头表示依赖关系,其它的不用说了吧!

     

    下面是一位大牛的代码,来源于:http://www.phppan.com/?s=设计模式

    <?php /** * 抽象工厂模式 2010-05-28 sz * @author phppan.p#gmail.com * http://www.phppan.com 哥学社成员(http://www.blog-brother.com/) * @package design pattern */ /** * 抽象工厂 */ 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(); } } /** * 抽象产品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; } } /** * 客户端 */ class Client { /** * Main program. */ 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(); ?>

     


    最新回复(0)