设计模式——抽象工厂

参考:http://www.cnblogs.com/xing901022/p/4034813.html

抽象工厂的主要意图:隐藏对象的创建过程,提供对象的使用接口

模式结构


AbstractFactory 提供创建对象的接口。
ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。
AbstractProduct 提供对象的使用接口。
ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。
Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。


场景:

早餐制作,有两种类型的食物:面食和饮品,用抽象类StapleFood和Drinks表示,面食的具体实现是油条类DeepFriedDoughSticks和面包类Bread,饮品的具体实现是豆浆类SoybeanMilk和牛奶类Milk。抽象工厂用来定义早餐的制作接口,制作一套StapleFood和Drinks。具体的早餐制作实现类是中式早餐BreakfastCStyle和西式早餐BreakfastCStyle。现在,我们就可以直接使用工厂实现类,来制作中餐或者西餐,而避免直接使用油条、面包、豆浆、牛奶类创建对象。

中餐工厂实现类的StapleFood返回一个油条DeepFriedDoughSticks对象,Drinks返回一个豆浆SoybeanMilk对象。

类图关系如下:


代码如下:

package com.designer;


/**
 * AbstractFactory designer
 * 抽象工厂
 * @author BJ
 *
 */
abstract class BreakfastFactory
{
public abstract StapleFood MakeStapleFood();
public abstract Drinks MakeDrinks();
}
abstract class StapleFood
{
public abstract void eating();
}
abstract class Drinks
{
public abstract void drinking();
}
class DeepFriedDoughSticks extends StapleFood
{


@Override
public void eating() {
// TODO Auto-generated method stub
System.out.println("我在吃油条!");
}

}
class SoybeanMilk extends Drinks
{


@Override
public void drinking() {
// TODO Auto-generated method stub
System.out.println("我在喝豆浆!");
}

}
class Bread extends StapleFood
{


@Override
public void eating() {
// TODO Auto-generated method stub
System.out.println("我在吃面包!");
}

}
class Milk extends Drinks
{


@Override
public void drinking() {
// TODO Auto-generated method stub
System.out.println("我在喝牛奶!");
}

}
class BreakfastCStyle extends BreakfastFactory
{


@Override
public StapleFood MakeStapleFood() {
// TODO Auto-generated method stub
return new DeepFriedDoughSticks();
}


@Override
public Drinks MakeDrinks() {
// TODO Auto-generated method stub
return new SoybeanMilk();
}

}
class BreakfastWStyle extends BreakfastFactory
{


@Override
public StapleFood MakeStapleFood() {
// TODO Auto-generated method stub
return new Bread();
}


@Override
public Drinks MakeDrinks() {
// TODO Auto-generated method stub
return new Milk();
}

}
/**
 * client
 * @author BJ
 *
 */
public class AbstractFactory {
public static void main(String args[])
{

//引用
StapleFood sf;
Drinks dk;
System.out.println("--------------第一天------------");
System.out.println("我要吃中餐");

//引用 = 实现
BreakfastFactory bf1 = new BreakfastCStyle();
sf = bf1.MakeStapleFood();
dk = bf1.MakeDrinks();
sf.eating();
dk.drinking();

System.out.println("--------------第二天------------");
System.out.println("我要吃西餐");
BreakfastFactory bf2 = new BreakfastWStyle();
sf = bf2.MakeStapleFood();
dk = bf2.MakeDrinks();
sf.eating();
dk.drinking();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值