设计模式——抽象工厂

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

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

模式结构

设计模式——抽象工厂_第1张图片

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


场景:

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

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

类图关系如下:

设计模式——抽象工厂_第2张图片

代码如下:

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

你可能感兴趣的:(设计模式——抽象工厂)