1.工厂模式简介
属于创建型模式。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
主要解决的问题:接口选择的问题。
2.分类
2.1 简单工厂模式
接口:interface具体:class工厂:factory
// 1 创建一个接口interface Shape{ ???const NAME = ‘vic‘; ???public function draw();}// 2.实体类class Rectangle implements Shape{ ???public function draw(){ ???????echo ‘Rectangle‘; ???}}class Square implements Shape{ ???public function draw(){ ???????echo ‘Square‘; ???}}class Circle implements Shape{ ???public function draw(){ ???????echo ‘Circle‘; ???}}// 新的图形,可以在此创建类,扩展
// 3.创建工厂class ShapeFactory { ???public static function getShape( string $shapeType){ ???????if( empty($shapeType) ){ ???????????return ; ???????} ???????switch( strtolower($shapeType) ){ ???????????case ‘rectangle‘: ???????????????return new Rectangle(); ???????????????break; ???????????case ‘Square‘: ???????????????return new Square(); ???????????????break; ???????????case ‘circle‘: ???????????????return new Circle(); ???????????????break; ???????????//如果有其他图形,可以扩展 ???????????} ???????return ; ???}}$shape = shapeFactory::getShape(‘Rectangle‘);$shape->draw();
2.2抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
接口:interface实体:class 抽象工厂:interface Factory工厂实体:class Factory创建工厂: factory
// 1 创建一个接口interface Shape{ ???const NAME = ‘vic‘; ???public function draw();}// 1.2 颜色接口interface Color{ ???function fill();}// 2.实体类class Rectangle implements Shape{ ???public function draw(){ ???????echo ‘Rectangle‘; ???}}class Square implements Shape{ ???public function draw(){ ???????echo ‘Square‘; ???}}class Circle implements Shape{ ???public function draw(){ ???????echo ‘Circle‘; ???}}// 2.2 颜色实体类class Red implements Color{ ???public function fill(){ ???????echo ‘Red‘; ???}}class Green implements Color{ ???public function fill(){ ???????echo ‘Green‘; ???}}class Blue implements Color{ ???public function fill(){ ???????echo ‘Blue‘; ???}}// 3 抽象工厂类interface Factory{ ???function getShape( string $shapeType ); ???function getColor( string $color );}// 4.工厂实体类class ShapeFactory implements Factory{ ???public function getShape( string $shapeType){ ???????if( empty($shapeType) ){ ???????????return ; ???????} ???????switch( strtolower($shapeType) ){ ???????????case ‘rectangle‘: ???????????????return new Rectangle(); ???????????????break; ???????????case ‘Square‘: ???????????????return new Square(); ???????????????break; ???????????case ‘circle‘: ???????????????return new Circle(); ???????????????break; ???????????//如果有其他图形,可以扩展 ???????????} ???????return ; ???} ???public function getColor( string $color ){ ???????//这里违背了接口隔离原则,此方法在此类中无用,却被迫实现 ???????return ; ???}}class ColorFactory implements Factory{ ???public function getShape( string $shapeType ){ ???????return ; ???} ???public function getColor( string $color ){ ???????if( empty($color )){ ???????????return ; ???????} ???????switch ( strtolower($color) ) { ???????????case ‘red‘: ???????????????return new Red(); ???????????????break; ???????????case ‘green‘: ???????????????return new Green(); ???????????????break; ???????????case ‘blue‘: ???????????????return new Blue(); ???????????????break; ???????} ???????return ; ???}}// 5 实现工厂class FactoryProduct{ ???public static function ?getFactory( $choice ){ ???????if( empty(strcasecmp($choice,‘shape‘)) ){ ???????????return new ShapeFactory(); ???????} else if ( empty(strcasecmp($choice, ‘color‘)) ){ ???????????return new ColorFactory(); ???????} ???????return ; ???}}try{ ???$factory = FactoryProduct::getFactory(‘shape‘); ???$shape ??= $factory->getShape(‘circle‘); ???????$shape->draw();// } catch( Exception $e){ ?// php5 捕获异常,不可以捕获错误// ????echo $e->getMessage();// }} catch( Error $e){ // php7 可以捕获错误 ???var_dump($e->getMessage());} ???// 捕获错误异常的方法 php5function shutdown_function(){ ???$e = error_get_last(); ???// var_dump($e);}register_shutdown_function(‘shutdown_function‘);
php的设计模式------工厂模式
原文地址:http://www.cnblogs.com/myvic/p/7978265.html