java模式学习之抽象工厂模式

抽象工厂模式

 

抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。

 

抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定具体产品类型的情况下,创建多个产品族中的产品,这就是抽象工厂模式的用意。

 

每个模式都是针对一定问题的解决方案,抽象工厂模式面对的问题是多个产品等级结构的系统设计。

 

抽象工厂模式中涉及到两个概念:产品族和产品等级结构

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族,比如:麦当劳和肯德基,这两个产品有不同的分店,北京有家麦当劳和肯德基店,上海也有家,北京的麦当劳和北京的肯德基组成一个产品族。

产品等级结构:北京的麦当劳和上海的麦当劳组成了一个产品等级结构。

示意图如下:

 

 

 

抽象工厂模式的结构

涉及到四个角色

1)抽象工厂角色:是抽象工厂方法模式的核心,与应用系统的商业逻辑无关。通过使用java接口或抽象类实现,而 所有的具体工厂类必须实现这个角色。

2)具体工厂角色:这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,通常使用

java类实现这个角色。

3)抽象产品角色:所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口,通常由java接口或抽象

类实现。

4)具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例,这是客户端最终需要的,通常由 java类实现。

 

/**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface KfcBread
{
}

 

/**
 * 具体产品角色
 * @author Administrator
 *
 */
public class ShangHaiKfc implements KfcBread
{
	public ShangHaiKfc()
	{
		System.out.println("肯德基出生地:上海");
	}
}

 

/**
 * 具体产品角色
 * @author Administrator
 *
 */
public class BeiJingKfc implements KfcBread
{
	public BeiJingKfc()
	{
		System.out.println("肯德基出生地:北京");
	}
}
 /**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface McdBread
{
}
/**
 * 具体产品角色
 * @author Administrator
 *
 */
public class ShangHaiMcd implements McdBread
{
	public ShangHaiMcd()
	{
		System.out.println("麦当劳出生地:上海");
	}
}
/**
 * 具体产品角色
 * @author Administrator
 *
 */
public class BeiJingMcd implements McdBread
{
	public BeiJingMcd()
	{
		System.out.println("麦当劳出生地:北京");
	}
}
/**
 * 抽象工厂角色
 * @author Administrator
 *
 */
public interface Toaster
{
	KfcBread toastKFC();
	
	McdBread toastMCD();
}

/**
 * 具体工厂角色
 * @author Administrator
 *
 */
public class ShangHaiToaster implements Toaster
{
	public KfcBread toastKFC()
	{
		return new ShangHaiKfc();
	}

	public McdBread toastMCD()
	{
		return new ShangHaiMcd();
	}
}
/**
 * 具体工厂角色
 * @author Administrator
 *
 */
public class BeiJingToaster implements Toaster
{
	public KfcBread toastKFC()
	{
		return new BeiJingKfc();
	}

	public McdBread toastMCD()
	{
		return new BeiJingMcd();
	}
}
/**
 * 测试类
 * @author Administrator
 *
 */
public class client
{
	public static void main(String[] args)
	{
		Toaster t1 = new BeiJingToaster();
		Toaster t2 = new ShangHaiToaster();
		
		McdBread mcd1 = t1.toastMCD();
		McdBread mcd2 = t2.toastMCD();
		
		KfcBread kfc1 = t1.toastKFC();
		KfcBread kfc2 = t2.toastKFC();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值