题目:
某餐馆有三种主餐,分别是牛奶和汤匙、面包和刀、肉和叉子 ,其中牛奶、面包和肉都属于食物,汤匙、刀和叉子都属于餐具,请利用抽象工厂模式实现对主餐的创建。
1.相关术语
-
产品等级结构:产品的继承结构,与类的继承相似。例如牛奶是一个抽象的类,那么牛奶和叉子、牛奶和刀和牛奶和勺子就是其子类。
-
产品族:指同一个工厂生产的,位于不同的产品等级结构的一组产品。例如牛奶,面包,肉都属于主餐,工具的等级结构不同,构成一个产品族。
-
抽象工厂:是一个接口,抽象工厂模式的核心,包含对多个产品等级结构的声明,任何工厂类都必须实现这个接口。
- 具体工厂:是抽象工厂的实现,负责实例化某个产品族中的产品对象。例如牛奶和勺子组合、肉和刀组合这些产品。
2.组合方式和等级结构
3.具体实现
Group接口
public interface Group {
public void get();
}
milk,meal,bread抽象类
milk
public abstract class milk implements Group {
//吃牛奶用汤勺
public abstract void get();
}
meal
public abstract class meal implements Group {
public abstract void get();
}
bread
public abstract class bread implements Group {
public abstract void get();
}
Usemilk类
public class Usemilk extends milk {
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("使用牛奶和汤勺");
}
}
Usemeal类
public class Usemeal extends meal {
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("使用肉和叉子");
}
}
Usebread类
public class Usebread extends bread {
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("使用面包和刀 ");
}
}
IAbstractFactory 抽象工厂类
public interface IAbstractFactory {
//实例化牛奶和勺子
public Group getmilk();
public Group getmeal();
public Group getbread();
}
ChooseFactory具体化工厂
public class ChooseFactory implements IAbstractFactory {
@Override
public Group getmeal() {
// TODO Auto-generated method stub
return new Usemeal();
}
@Override
public Group getmilk() {
// TODO Auto-generated method stub
return new Usemilk();
}
@Override
public Group getbread() {
// TODO Auto-generated method stub
return new Usebread();
}
}
Test测试
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建工厂
IAbstractFactory factory = new ChooseFactory();
Group milk = factory.getmilk();
System.out.println("使用的工具是*************");
//通过工厂实现创建牛奶和勺子实例
milk.get();
System.out.println("使用的工具是*************");
Group meal = factory.getmeal();
meal.get();
System.out.println("使用的工具是*************");
Group bread = factory.getbread();
bread.get();
}
}