设计模式一(抽象工厂模式)

1.抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式

使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可不需逐一寻找代码中具体实例化的地方(new处)修改了

为系统结构提供灵活的动态扩展机制,减少了耦合。

抽象多个工厂; 

 

 

<?php
/*
interface是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法
不能定义方法体,也不能声明实例变量 。 interface 却可以声明常量变量 。
*/
interface Car
{
    const BIG=100; //
    public function getWidth(); //获取车宽度 不允许用private和protected修饰
    public function getHeight();//获取车高度
}

interface Colors
{
    public function setColor($c);
    public function getColor();
}
/**
抽象工厂类的定义;必须实现车和颜色的interface接口
1.抽象类是和抽象方法
2.抽象类不能被直接实例化即new;抽象类中只定义(或部分实现)子类需要的方法。
子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。
3.子类必须实现抽象类利所有抽象方法
4.抽象方法只能用public 和protected修饰
**/
abstract class AbstractFactory implements Car,Colors
{
    //获取车的属性
    abstract public function getWidth();
    abstract public function getHeight();
    
    //获取车颜色
    abstract public function setColor($c);
    abstract public function getColor();
    public function getName(){
        return '宝马';
    }
}
/*
子类必须实现父类的抽象方法和接口的方法
*/
class CarFactory extends AbstractFactory
{
    protected $car_color;
    protected $h;
    protected $w;
    public function getWidth()
    {
        return 1000;
    }
    public function getHeight()
    {
        return 200;
    }
    public function setColor($c){
        
    }
    public function getColor(){
        return null;
    }
}

/*
子类必须实现父类的抽象方法和接口的方法
*/
class ColorFactory extends AbstractFactory
{
    protected $car_color;
    protected $h;
    protected $w;
    public function getWidth()
    {
        return null;
    }
    public function getHeight()
    {
        return null;
    }
    public function setColor($c){
        $this->car_color = $c;
    }
    public function getColor(){
        return $this->car_color;
    }
}

//实现生产车的类
class ProductCar 
{
    public static function getFactory($type){
        if($type=='car'){
            return new CarFactory();
        }elseif($type=='color'){
            return new ColorFactory();
        }
    }
}

//开始使用
//获取车属性
$fac_car = ProductCar::getFactory('car');
echo $fac_car->getWidth();

//后去颜色属性
$fac_color = ProductCar::getFactory('color');
$fac_color->setColor('红色');
echo $fac_color->getColor();


?>

 

实例2: 工厂模式的用示例

<?php
header('Content-Type:text/html;charset=utf-8');
/**
 *简单工厂模式(静态工厂方法模式)
 */
/**
 * Interface people 人类
 */
interface  people
{
    public function  say();
}
/**
 * Class man 继承people的男人类
 */
class man implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是男人<br>';
    }
}
/**
 * Class women 继承people的女人类
 */
class women implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo '我是女人<br>';
    }
}
/**
 * Class SimpleFactoty 工厂类
 */
class SimpleFactoty
{
    // 简单工厂里的静态方法-用于创建男人对象
    static function createMan()
    {
        return new man();
    }
    // 简单工厂里的静态方法-用于创建女人对象
    static function createWomen()
    {
        return new women();
    }
}
/**
 * 具体调用
 */
$man = SimpleFactoty::createMan();
$man->say();
$woman = SimpleFactoty::createWomen();
$woman->say();
?>

 

posted @ 2019-05-25 23:56  王默默  阅读(181)  评论(0编辑  收藏  举报