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

1.抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

抽象多个工厂; 

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


?>

猜你喜欢

转载自www.cnblogs.com/wanglijun/p/10924650.html