参考: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();
}
}