一、实验目的:
- 掌握建造者模式(Builder)的特点
- 分析具体问题,使用建造者模式进行设计。
- 掌握单例模式(Singleton)的特点
- 分析具体问题,使用单例模式进行设计。
二、实验环境:
eclipse win10
三、实验内容:
(写出主要的内容)
实例:KFC套餐
建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。利用建造者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
UML图:
代码:
package builder;
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
package builder;
public abstract class MealBuilder {
Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal(){
return meal;
}
}
package builder;
public class SubMealBuilderA extends MealBuilder{
public void buildDrink() {
meal.setDrink("可乐");
}
public void buildFood() {
meal.setFood("汉堡");
}
}
package builder;
public class SubMealBuilderB extends MealBuilder{
public void buildDrink() {
meal.setDrink("果汁");
}
public void buildFood() {
meal.setFood("鸡肉卷");
}
}
package builder;
public class Waiter {
private MealBuilder mealBuilder;
public Waiter(MealBuilder mealBuilder) {
this.mealBuilder = mealBuilder;
}
public Meal construct(){
//准备食物
mealBuilder.buildFood();
//准备饮料
mealBuilder.buildDrink();
//准备完毕,返回一个完整的套餐给客户
return mealBuilder.getMeal();
}
}
package builder;
public class Client {
public static void main(String[] args) {
//套餐A
SubMealBuilderA a = new SubMealBuilderA();
//准备套餐A的服务员
Waiter waiter = new Waiter(a);
//获得套餐
Meal mealA = waiter.construct();
System.out.print("套餐A的组成部分:");
System.out.println("主食:"+mealA.getFood()+"; "+"饮料:"+mealA.getDrink());
}
}
在操作系统中,打印池(Print Spooler)是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变打印任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。
UML图:
package Singleton;
public class PrintSpoolerSingleton
{
private static PrintSpoolerSingleton instance=null;
private PrintSpoolerSingleton()
{
}
public static PrintSpoolerSingleton getInstance() throws PrintSpoolerException
{
if(instance==null)
{
System.out.println("创建打印池!");
instance=new PrintSpoolerSingleton();
}
else
{
throw new PrintSpoolerException("打印池正在工作中!");
}
return instance;
}
public void manageJobs()
{
System.out.println("管理打印任务!");
}
}
package Singleton;
public class PrintSpoolerException extends Exception
{
public PrintSpoolerException(String message)
{
super(message);
}
}
package Singleton;
public class Client
{
public static void main(String a[])
{
PrintSpoolerSingleton ps1,ps2;
try
{
ps1=PrintSpoolerSingleton.getInstance();
ps1.manageJobs();
}
catch(PrintSpoolerException e)
{
System.out.println(e.getMessage());
}
System.out.println("--------------------------");
try
{
ps2=PrintSpoolerSingleton.getInstance();
ps2.manageJobs();
}
catch(PrintSpoolerException e)
{
System.out.println(e.getMessage());
}
}
}