php抽象工厂模式

抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,在学习什么是抽象工厂模式之前,需要对“ 工厂方法模式”有一定的了解,可以点击链接【php工厂方法模式】查看进行了解。
个人理解:
如果说“工厂方法模式”是针对的是一个产品等级结构,那么,抽象工厂方法则是针对的多个产品等级结构。
引用前辈资料进行解释如下:

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。
明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中, 如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式; 如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。
1 类的实现
代码示例:
# 定义一个抽象工厂接口AnimalFactory
interface AnimalFactory {  

        public function createCat();	# 创建方法1   createCat
        public function createDog();	# 创建方法2   createDog  
          
}  
# 定义一个具体的工厂BlackAnimalFactory 其中实现了接口的两个方法createCat、createDog
class BlackAnimalFactory implements AnimalFactory {  
    # 方法1  
    function createCat(){  
        return new BlackCat();  
    }  
    # 方法2 
    function createDog(){  
        return new BlackDog();    
    }  
}
# 定义另一个具体的工厂WhiteAnimalFactory 其中实现了接口的两个方法createCat、createDog
class WhiteAnimalFactory implements AnimalFactory {  
    # 方法1   
    function createCat(){  
        return new WhiteCat();  
    }  
    # 方法2
    function createDog(){  
        return new WhiteDog();  
    }  
} 
到这里我们就已经可以看出来,该示例与工厂方法模式的区别了 ,黑猫和白猫属于同一个等级结构黑狗和白狗属于同一个等级结构,显而易见出现了 两个等级结构,所以它不是工厂方法模式而是抽象工厂模式,这也是两者的区别之处。
我们继续看代码:
# 定义两个抽象的产品接口
interface Cat {  
    function Voice();  
}  
  
interface Dog {  
    function Voice();     
}
# 定义具体的产品角色
class BlackCat implements Cat {  	      # 角色1
    function Voice(){  
        echo '我是一只黑猫';  
    }  
}  
class WhiteCat implements Cat {  	      # 角色2
    function Voice(){  
        echo '我是一只白猫';  
    }  
}  
class BlackDog implements Dog {  	      # 角色3
    function Voice(){  
        echo '我是一只黑狗';  
    }  
}  
class WhiteDog implements Dog { 	      # 角色4
    function Voice(){  
        echo '我是一只白狗';  
    }  
}  

# 定义一个访问

class Client {
	public static function main(){
		self::voice(new BlackAnimalFactory);
		self::voice(new WhiteAnimalFactory);
	}
	
	private static function voice($AnimalFactory){
		$cat = $AnimalFactory->createCat();  
                $cat->Voice();  
        	echo '<br>';  
        	$dog = $AnimalFactory->createDog();  
        	$dog->Voice(); 
		echo '<br>';  		
	}
}

# 输出看一下
Client::main();
# 结果
我是一只黑猫
我是一只黑狗
我是一只白猫
我是一只白狗
2 结论
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于 工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了 解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
3 特点
优点:
1、 具备工厂方法的所有优点
2、 可以在类的内部对产品族进行约束(所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。)
缺点:
产品族的 扩展将会很麻烦,因为新增一个产品,则几乎所有的工厂类都需要进行修改。

更多设计模式文章请点击下面链接:
【设计模式概述】 http://blog.csdn.net/bk_guo/article/details/73828064
【简单工厂模式】 http://blog.csdn.net/bk_guo/article/details/73849317
【单例模式】 http://blog.csdn.net/bk_guo/article/details/73845244
【工厂方法模式】 http://blog.csdn.net/bk_guo/article/details/73896262

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值