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