个人学习笔记-设计模式-简单工厂模式

代码部分内容参考书籍:《大话设计模式_程杰》(第2章 商场促销一策略模式)
相关博客链接:https://www.cnblogs.com/cj723/

写在最前:《大话设计模式_程杰》这是一本强烈安利的书籍,对程序员学习设计模式来说,可以算得上是一本巨大的福利。通过一问一答对话的模式,由浅入深,抽丝剥茧,最终融会贯通,大道至简。
例如,在讲述曹操将“喝酒唱歌,人生真爽”改成“对酒当歌,人生几何”过程时,我感觉我是懂了…
在这里插入图片描述
以上截图来源于书籍《大话设计模式_程杰》

回归正题,看需求~~~(具体的分析过程,大家可以去书籍中了解。这边列出代码,仅做参考互相学习。)

1、需求

做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。

2、效果图

2.1 “正常收费”类型

在这里插入图片描述

2.2 “满500返200”类型

在这里插入图片描述

2.3 “满500返200”类型

在这里插入图片描述

3、具体实现代码

目录结构:
在这里插入图片描述

3.1 收费抽象类CashSuper
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 收费抽象类
 * @Author zhengwd
 * @Date 2023/4/12 14:31
 **/
public abstract class CashSuper {

    public abstract double acceptCash(double money);
}

3.2 正常收费子类CashNormal
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 正常收费子类,原价返回
 * @Author zhengwd
 * @Date 2023/4/12 14:35
 **/
public class CashNormal extends CashSuper {

    @Override
    public double acceptCash(double money) {
        return money;
    }
}

3.3 打折收费子类CashRebate
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 打折收费子类,初始化时必须输入折扣率,如8折就是0.8
 * @Author zhengwd
 * @Date 2023/4/12 14:37
 **/
public class CashRebate extends CashSuper {

    /**
     * 折扣率
     */
    private double moneyRebate;

    public CashRebate(double moneyRebate) {
        this.moneyRebate = moneyRebate;
    }

    @Override
    public double acceptCash(double money) {
        return money * moneyRebate;
    }
}

3.4 返利折扣子类CashReturn
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 返利折扣子类,初始化时必须输入返利条件和返利值,比如满300返100,则 moneyCondition 为300,moneyReturn 为100
 * @Author zhengwd
 * @Date 2023/4/12 14:43
 **/
public class CashReturn extends CashSuper {

    /**
     *返利条件
     */
    private double moneyCondition;

    /**
     *返利值
     */
    private double moneyReturn;

    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }

    @Override
    public double acceptCash(double money) {
        double result = money;
        // 当大于返利条件时,则需要减去返利值
        if (money >= moneyCondition) {
            result = money - Math.floor(money / moneyCondition) * moneyReturn;
        }
        return result;
    }
}

3.5 收费工厂类CashFactory
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 收费工厂类
 * @Author zhengwd
 * @Date 2023/4/12 14:55
 **/
public class CashFactory {

    /**
     * 初始化收费模式方法
     * @param type
     * @return
     */
    public static CashSuper createCashAccept(String type) {
        CashSuper cashSuper = null;
        switch (type) {
            case "正常收费":
                cashSuper = new CashNormal();
                break;
            case "打5折":
                cashSuper = new CashRebate(0.5);
                break;
            case "打8折":
                cashSuper = new CashRebate(0.8);
                break;
            case "满300返100":
                cashSuper = new CashReturn(300, 100);
                break;
            case "满500返200":
                cashSuper = new CashReturn(500, 200);
                break;
        }
        return cashSuper;
    }
}

3.6 调用入口类Cashier
package com.zwd.cases.demo.gof23.strategic;

/**
 * @Description 简单工厂模式应用举例
 * 题目: 做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。
 * @Author zhengwd
 * @Date 2023/4/12 14:16
 **/
public class Cashier {

    public static void main(String[] args) {
        // 结算类型:正常收费、打8折、满300返100、打5折、满500返200
        String type = "正常收费";
        CashFactory factory = new CashFactory();
        CashSuper cashAccept = factory.createCashAccept(type);
        double price = 100d;
        double num = 5d;
        double money = price * num;
        double result = cashAccept.acceptCash(money);
        System.out.println("=========结算类型:" + type);
        System.out.println("=========单价:" + price);
        System.out.println("=========数量:" + num);
        System.out.println("=========消费金额:" + result);
    }
}

完结,撒花~~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值