设计模式:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

人种接口

public interface Human
{	
	//每个人种的皮肤都有相应的颜色
	public abstract void getColor();
	
	//人类会说话
	public abstract void talk();
	
	//人类有性别
	public abstract void getSex();
}

人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。黑色人种、白色人种、黄色人种。

//黑色人种抽象类
public abstract class AbstractBlackHuman implements Human
{
	@Override
	public void getColor()
	{
		System.out.println("黑种人黑色皮肤");
	}
	@Override
	public void talk()
	{
		System.out.println("黑种人说印度语");
	}
}

//白色人种抽象类
public abstract class AbstractWhiteHuman implements Human
{		
		@Override
		public  void getColor(){
			System.out.println("白种人白色皮肤");
		}
		@Override
		public void talk(){
			System.out.println("白种人说英语");
		}
}

//黄色人种抽象类
public abstract class AbstractYellowHuman implements Human
{
	@Override
	public void getColor()
	{
		System.out.println("黄种人黄色皮肤");
	}
	@Override
	public void talk()
	{
		System.out.println("黄种人说汉语");
	}
}

每个人种抽象类会有两个实现,以性别来定义。

public class FemaleBlackHuman extends AbstractBlackHuman
{
	@Override
	public void getSex()
	{
		System.out.println("黑人女性");
	}
}

public class MaleBlackHuman extends AbstractBlackHuman
{
	@Override
	public void getSex()
	{
		System.out.println("黑人男性");
	}
}

另外两个抽象类的实现相类似,不再赘述。

产品类说清楚了,接下来说工厂类。主要有两个工厂类,一个是男性工厂类,一个是女性工厂类。

工厂类的接口

public interface HumanFactory
{
	//制造一个黑人
	public Human createBlackHuamn();
	//制造一个白人
	public Human createWhiteHuman();
	//制造一个黄人
	public Human createYellowHuman();
}
男性工厂类的接口实现

public class MaleFactory implements HumanFactory
{
	@Override
	public Human createBlackHuamn()
	{
		return new MaleBlackHuman();
	}
	@Override
	public Human createWhiteHuman()
	{
		return new MaleWhiteHuman();
	}
	@Override
	public Human createYellowHuman()
	{
		return new MaleYellowHuman();
	}
}

女性工厂类的接口实现

public class FemaleFactory implements HumanFactory
{
	@Override
	public Human createBlackHuamn()
	{
		return new FemaleBlackHuman();
	}
	@Override
	public Human createWhiteHuman()
	{
		return new FemaleWhiteHuman();
	}
	@Override
	public Human createYellowHuman()
	{
		return new FemaleYellowHuman();
	}
}

针对以上两个工厂类,可以创建不同性别不同肤色的人。

以上模式就HumanFactory.java接口依赖Human.java接口,而不需要指定他们具体的实现类。

在抽象工厂模式中,AbstractBlackHuman,AbstractWhiteHuman,AbstractYellowHuman等抽象类可以定义为产品族,HumanFactory定义为抽象工厂。

需要注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。

需要注意:有M个产品等级就应该有M个实现工厂类,每个实现工厂中,实现不同产品族的生产任务。

在这样的设计模式中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。

优点:封装性,每个产品的实现类不是高层模块关心的,它关心接口和抽象类,只需要关心工厂类是谁,就能创建出一个需要的对象。

产品族的内部的约束为非公开状态。

缺点:产品族扩展困难,如果增加一个产品族,就需要在HumanFactory中增加方法,实现类同样要增加方法。

但是产品等级的扩展很简单,只需要为新的产品等级新增一个工厂类实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值