软件设计模式--建造者模式---KFC套餐

软件设计体系 专栏收录该内容
30 篇文章 3 订阅

实例:KFC套餐 建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。

 

 

 

客户端类client:
public class Client
{
	public static void main(String args[])
	{
		//动态确定套餐种类
	    MealBuilder mb=(MealBuilder)XMLUtil.getBean();
		//服务员是指挥者
		KFCWaiter waiter=new KFCWaiter();
	    //服务员准备套餐
	    waiter.setMealBuilder(mb);
	    //客户获得套餐
	    Meal meal=waiter.construct();
        
        System.out.println("套餐组成:");
        System.out.println(meal.getFood());
        System.out.println(meal.getDrink());
	}
}
配置文件config.xml

<?xml version="1.0"?>
<config>
    <className>SubMealBuilderB</className>
</config>
KFCWaiter类:
public class KFCWaiter
{
	private MealBuilder mb;
	public void setMealBuilder(MealBuilder mb)
	{
		this.mb=mb;
	}
	public Meal construct()
	{
		mb.buildFood();
		mb.buildDrink();
		return mb.getMeal();
	}
}
Meal类:
public class Meal
{
	//food和drink是部件
	private String food;
	private String drink;
	
	public void setFood(String food) {
		this.food = food; 
	}

	public void setDrink(String drink) {
		this.drink = drink; 
	}

	public String getFood() {
		return (this.food); 
	}

	public String getDrink() {
		return (this.drink); 
	}
}
抽象类MealBuilder:
public abstract class MealBuilder
{
	protected Meal meal=new Meal();
	public abstract void buildFood();
	public abstract void buildDrink();
	public Meal getMeal()
	{
		return meal;
	}
}
SubMealBuilderA 类:
public class SubMealBuilderA extends MealBuilder
{
	public void buildFood()
	{
		meal.setFood("一个鸡腿堡");
	}
	public void buildDrink()
	{
	    meal.setDrink("一杯可乐");
	}
}
SubMealBuilderB 类:
public class SubMealBuilderB extends MealBuilder
{
	public void buildFood()
	{
		meal.setFood("一个鸡肉卷");
	}
	public void buildDrink()
	{
		 meal.setDrink("一杯果汁");
	}
}
XMLUtil类:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
	public static Object getBean()
	{
		try
		{
			//创建文档对象
			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dFactory.newDocumentBuilder();
			Document doc;							
			doc = builder.parse(new File("config.xml")); 
		
			//获取包含类名的文本节点
			NodeList nl = doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();
            
            //通过类名生成实例对象并将其返回
            Class c=Class.forName(cName);
	  	    Object obj=c.newInstance();
            return obj;
           }   
           	catch(Exception e)
           	{
           		e.printStackTrace();
           		return null;
           	}
		}
}

 

  • 1
    点赞
  • 6
    评论
  • 15
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值