【软件工程综合实践】简单工厂模式之蛋糕店(完整代码)

一、蛋糕店点餐系统

需求:设计一个蛋糕店点餐系统。

设计一个蛋糕类(Cake),并定义其两个子类(草莓蛋糕【StrawberryCake】和柠檬蛋糕【LemonCake】);再设计一个蛋糕店类(CakeStore),蛋糕店具有点蛋糕的功能。

1、先写好Cake这个类
public class Cake {
    String type ="";
    public  void addMilk(){

    }
    public  void addFlour(){

    }
    public String getName(){

        return type;
    }
}
2、草莓蛋糕【StrawberryCake】
public class StrawberryCake extends Cake{
    public StrawberryCake() {
    }

    @Override
    public void addMilk() {
        System.out.println("给蛋糕加牛奶!");
    }
    @Override
    public void addFlour() {
        System.out.println("给蛋糕加面粉!");
    }
    @Override
    public String getName() {
        return "草莓蛋糕新鲜出炉!";
    }
}

3、柠檬蛋糕【LemonCake】
public class LemonCake extends Cake {

    @Override
    public void addMilk() {
        System.out.println("给蛋糕加牛奶!");
    }

    @Override
    public void addFlour() {
        System.out.println("给蛋糕加面粉!");
    }

    @Override
    public String getName() {
        return "柠檬蛋糕新鲜出炉!";
    }
}

4、蛋糕店
public class CakeStore {
    public void welcome(){
        System.out.println("欢迎来到蛋糕餐厅!");
        System.out.println("-------------------------");
    }
    public void goodbye(){
        System.out.println("-------------------------");
        System.out.println("欢迎下次光临!");
    }
}

5、客户端
public class Client {

    public static void main(String[] args) {
        Scanner input =new Scanner(System.in);
        CakeStore cakeStore = new CakeStore();
        cakeStore.welcome();
        System.out.println("请选择蛋糕口味(StrawberryCake/LemonCake)");
        String type = input.nextLine();

        Cake cake;
        cake = CakeFactory.createCake(type);
        System.out.println(cake.getName());


        cakeStore.goodbye();

//        CakeStore cakeStore = new CakeStore();
//        Cake cake = cakeStore.createCake(type);
//        System.out.println(cake.getName());
    }
}

6、蛋糕工厂类

如果需要增加几种蛋糕,需要修改CakeStore代码。如果我们使用工厂来生产对象,我们就只需要和工厂沟通,彻底和对象解耦,因此,工厂模式最大的有点是解耦

public class CakeFactory {

    public static Cake createCake(String type) {
        Cake cake = null;
        if("StrawberryCake".equals(type)){
            cake = new StrawberryCake();
        }else if("LemonCake".equals(type)){
            cake = new LemonCake();

        }
        cake.addMilk();
        cake.addFlour();
        return cake;
    }
}

二、运行结果

请添加图片描述
请添加图片描述

三、总结

工厂模式封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利,违背了“开闭原则”。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值