工厂设计模式

本文通过一个获取奖励的场景介绍了简单工厂模式,展示了如何根据参数返回不同类型的奖励,如优惠券和现金。当需求扩展到考虑用户类型(如小学生)时,引入了抽象工厂模式,通过创建不同的工厂类(如学生工厂和教师工厂)来适应不同用户群体的奖励发放,避免了在单一方法中进行复杂的条件判断。
摘要由CSDN通过智能技术生成

简单工厂模式

首先看一下简单工厂模式。我们模拟一下获取奖励的一个场景,从工厂中获取不同的奖励,例如是优惠券或者现金奖励。

  • 首先创建一个接口,让所有的奖励都实现这个接口。
奖励接口
public interface Commodity {
}
奖励的具体实现类,优惠券类
public class Coupon implements Commodity{
    public Coupon() {
        System.out.println("恭喜你获取了一张优惠券");
    }
}
奖励的具体实现类,奖金类
public class Price implements Commodity{
    public Price() {
        System.out.println("恭喜你获取了现金奖励。");
    }
}
  • 创建一个工厂根据参数返回不同的奖励
public class Factory {
    public static Commodity getCommodity(int i){
        switch (i){
            case 1:return new Price();
            case 2:return new Coupon();
            default:
                System.out.println("你输入的编码有误,没有获取商品奖励。");
                return null;
        }

    }
}

Main方法调用:

public class Main {
    public static void main(String[] args) {
        Commodity commodity = Factory.getCommodity(1);
    }
}

抽象⼯⼚模式

假如这个时候突然需要新加一个需求,就是因为如果是小学生中奖了,但是小学生不能进行消费所以不发放现金和优惠券而是改成糖果和精美作业本。
那么我们就要改成这个样子

public static Commodity getCommodity2(int i,int j){
        switch (i){
            case 1:{
                return j==1?new Price():new Candy();
            }
            case 2:return j==1? new Coupon():new Book();
            default:
                System.out.println("你输入的编码有误,没有获取商品奖励。");
                return null;
        }

    }

那如果后面要根据用户的种类或者说用户的等级来决定奖励用户的是什么,每个case里面都要多重判断是不是很麻烦。这个时候就可以使用抽象工厂模式。

创建一个接口只定义方法,具体的实现由子类实现

public interface CommodityAdapter {
    Commodity getCommodity(int i);
}

public class StudentFactory implements CommodityAdapter{
    public Commodity getCommodity(int i){
        switch (i){
            case 1:{
                return new Candy();
            }
            case 2:return new Book();
            default:
                System.out.println("你输入的编码有误,没有获取商品奖励。");
                return null;
        }

    }

}
public class TeacherFactory implements CommodityAdapter{

    @Override
    public Commodity getCommodity(int i) {
        switch (i) {
            case 1:
                return new Price();
            case 2:
                return new Coupon();
            default:
                System.out.println("你输入的编码有误,没有获取商品奖励。");
                return null;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值