设计模式之创建型之抽象工厂模式(Abstract Factory Pattern)

 

                                               抽象工厂模式

一、什么是产品族?

是指位于不同产品等级结构中,功能相关联的产品组成的家族。这句话真的是太深奥了,网上查了下,那么你能解释什么叫产品族,可是我怎么知道什么是产品等级结构呢?网上没找到解释的,我看了一些源代码,自己理解的:动物又包括狗,猫等,狗又包括白狗,黑狗,猫有包括白猫,黑猫,那么我们可以将白猫和白狗放在一起,这就组成了一个白色动物的产品族!


二、什么是抽象工厂模式?

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式提供多个具体工厂角色,分别对应于这多个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。例如产白猫(属于白色动物工厂角色)的就只产白猫。


三、工厂方法与抽象工厂方法:

工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。例如,工厂方法产动物就只管产动物,而抽象的则再多了一个等级,会产生不同颜色的动物,这个要是用工厂方法则会产生许多平行的等级结构


四、适用性,为什么要用抽象工厂模式:

1、当一个类不知道它所必须创建的对象的类的时候,

2、当一个类希望由它的子类来指定它所创建的对象的时候

那么知道1,2的时候,我们就应当选择工厂创建模型了

3、一个系统要由多个产品系列中的一个来配置时

4、处理具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题


五、示例角色和结构:


角色:

抽象产品角色:工厂方法模式所创建的对象的父类,或它们共同拥有的接口,本例中的,IDog,ICat。

具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例,本例中的BlackCat,BlackDog,White。。。等四个。

抽象工厂角色:工厂方法模式的核心,本例中的IAnimalFactory。

具体工厂角色:在客户端的调用下创建产品的实例,本例中的BlackAnimal,WhiteAnimal。


六、示例代码:

 

package AbstractFactoryPattern;
public interface ICat {
	public void eat();//猫吃的方法
}

public interface IDog {
	public void eat();
}

public class WhiteCat implements ICat{
	public void eat() {
		System.out.println("WhiteCat eat");		
	}
}

public class BlackCat implements ICat{
	public void eat() {
		System.out.println("BlackCat eat");
	}
}

public class BlackDog implements IDog{
	public void eat() {
		System.out.println("BlackDog eat");			
	}
}

public class WhiteDog implements IDog{
	public void eat() {
		System.out.println("WhiteDog eat");	
	}
}

public interface IAnimalFactory {
	public ICat createCat();
	public IDog createDog();
}

public class WhiteAnimal implements IAnimalFactory{
	public ICat createCat() {
		return new WhiteCat();
	}
	public IDog createDog() {
		return new WhiteDog();
	}
}

public class BlackAnimal implements IAnimalFactory{
	public ICat createCat() {
		return new BlackCat();
	}
	public IDog createDog() {
		return new BlackDog();
	}
}

public class Test {
	public static void main(String[] args) {
		IAnimalFactory biaf=new BlackAnimal();
		ICat bic=biaf.createCat();
		IDog bid=biaf.createDog();
		IAnimalFactory wiaf=new WhiteAnimal();
		ICat wic=wiaf.createCat();
		IDog wid=wiaf.createDog();
		bic.eat();
		bid.eat();
		wic.eat();
		wid.eat();
	}
}

白猫,黑猫都属于猫。白狗,黑狗都属于狗。而猫狗都属于动物,所以动物依赖于猫狗等。而白猫,白狗都是白色动物,所以白动物又依赖于白猫狗。当动物工厂生产的时候,直接成产所需要的白色或黑色的动物,而白色动物又可以直接产生白猫或白狗。

 

八、优缺点:

优点:

1、扩充了工厂方法模式,支持多个产品族的创建!

2、符合开闭原则是不用说的了。每次增加新的产品,只需添加新的产品族,具体产品类,添加相应的具体工厂类即可!

3、依赖倒置原则也不用说了,主要依赖我们的接口,不依赖具体的实现类!

缺点:

1、暴漏具体工厂(这个不大明白什么意思);

2、要和其他模式如单利模式一起使用效果才会比较好!

3、个人觉得,要写的类什么的太多了,容易记混,而且架构图不怎么好画,画出来了都看起来很复杂似得

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值