php 八大设计模式-工厂模式

目的:

提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤,实际上就是建立一个统一的类实例化的函数接口,完成统一调用,统一控制。

工厂模式也分为三种:

  1. 工厂模式
  2. 抽象工厂模式

工厂模式

<?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();

?>
原文地址:https://www.cnblogs.com/fangdada/p/14851943.html