建造者模式与单例模式

一、实验目的:

  1. 掌握建造者模式(Builder)的特点
  2. 分析具体问题,使用建造者模式进行设计。
  3. 掌握单例模式(Singleton)的特点
  4. 分析具体问题,使用单例模式进行设计。

二、实验环境:

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值