简单工厂模式
首先看一下简单工厂模式。我们模拟一下获取奖励的一个场景,从工厂中获取不同的奖励,例如是优惠券或者现金奖励。
- 首先创建一个接口,让所有的奖励都实现这个接口。
奖励接口
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;
}
}
}