码迷,mamicode.com
首页 > 其他好文 > 详细

抽象工厂模式

时间:2017-10-30 14:17:50      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:factor   .com   abs   not   gre   tar   复杂   return   nba   

先前有简单工厂模式工厂模式,工厂模式在简单工厂模式基础上解耦和。

而工厂模式和抽象工厂模式有什么不同呢?有人可能会发问,工厂模式的代码里面不是有个抽象的工厂类吗?

对于这一点,的确如此,但是每一个工厂类只能生产一个产品(要么香蕉,要么苹果),不能生产一个产品族(水果拼盘)。而抽象工厂模式刚好做到这一点,它能生产出一个产品族(包含很多种产品)

抽象工厂包含多个产品结构的声明,任何工厂类都必须实现这个借口。

请看下面代码:

<?php 
	//创建水果基类
	abstract class Fruit{
		abstract public function say();
	}
	//创建一个绿苹果类
	class GreenApple extends Fruit{
		public function say(){
			echo "I‘m Green Apple\n";
		}
	}
	//创建一个红苹果类
	class RedApple extends Fruit{
		public function say(){
			echo "I‘m Red Apple\n";
		}
	}
	//创建一个绿香蕉类
	class GreenBanana extends Fruit{
		public function say(){
			echo "I‘m Green banana\n";
		}
	}	
	//创建一个黄香蕉类
	class YellowBanana extends Fruit{
		public function say(){
			echo "I‘m Yellow banana\n";
		}
	}	

	//创建一个抽象工厂来
	abstract class Factory{
		abstract public function getApple();
		abstract public function getBanana();
	}
	//创建不生产绿色水果的工厂类
	class NotGreenFactory extends Factory{
		public function getApple(){
			return new RedApple;
		}
		public function getBanana(){
			return new YellowBanana;
		}
	} 
	//创建生产绿色水果的工厂类
	class GreenFactory extends Factory{
		public function getApple(){
			return new GreenApple;
		}
		public function getBanana(){
			return new GreenBanana;
		}
	}

	//用绿色工厂类来生产水果,生产的水果为绿色
	$factory=new GreenFactory();
	$fruit=$factory->getApple();
	$fruit->say();//I‘m Green Apple

	//用非绿色工厂类来生产水果,生产的水果为非绿色
	$factory=new NotGreenFactory();
	$fruit=$factory->getBanana();
	$fruit->say();//I‘m Yellow banana
 ?>

  看了上面的代码,感觉还没工厂模式好用,因为用抽象工厂模式,当有新产品的时候,不仅要创建新产品的类,还要修改抽象工厂类中的方法(添加获得新增产品的接口),然后让各具体工厂类实现,可以说是比较复杂的,很难扩展。

抽象工厂模式

标签:factor   .com   abs   not   gre   tar   复杂   return   nba   

原文地址:http://www.cnblogs.com/-beyond/p/7753920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!