工厂模式概述

工厂模式概述

在我们正式讲解工厂模式之前,我们先来看一个需求,看看目前的解决方案都存在什么问题,然后一步一步引入我们的工厂模式,看看工厂模式的优缺点是什么。


工厂模式的超链接跳转


需求:设计一个咖啡店点餐系统。

设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

先来看一个需求,设计一个咖啡店点餐系统。咖啡店点餐系统点的肯定是咖啡,所以我们需要设计咖啡类,而咖啡的话它又拥有不同的品种,美式咖啡、拿铁咖啡。

那么这一块儿我们应该如何去设计呢?让美式咖啡和拿铁咖啡继承咖啡类就行了,因为美式和拿铁可以向上抽取共性的东西放在咖啡类里边儿,提高代码的一个复用性。

美式咖啡和拿铁咖啡就是咖啡类的两个子类,咖啡类设计完了之后,我们还需要设计一个咖啡店类,它具有点咖啡的功能,客户来了之后可以进行咖啡的一个点餐。

来看一下下面的类图。

在这里插入图片描述

首先coffee 咖啡类里边有三个方法,一个是 getname、add milk、 add sugar 加奶加糖的方法。基本上所有种类的咖啡都需要加奶加糖, 但是与不同的这个咖啡品种或者返回的这个名称是不一样的。所以getname这个方法在 coffee 里边,它是一个抽象的,要求子类去重写。

那么再来看下面这两个类,一个是 american coffee 美式咖啡,它重写了 get name 方法。后边这个是 lite coffee 它是拿铁咖啡,它也重写了 get name 方法。

再来看coffee store 咖啡店的这个类,它里边只有一个方法,就是 order coffee 点咖啡的这个功能方法。这里边参数表示要点什么咖啡,拿铁还是美式咖啡,根据类型去点餐。

那么这个类型的话,我们现在规定的就是一个字符串。如果是咱们的这个美式咖啡的话,那么你直接给我来一个 america ;如果是拿铁咖啡的话,你给我给我一个 letter 就行了,这是我们定义的一个规范。

Coffee

public abstract class Coffee {

    public abstract String getName();

    //加糖
    public void addsugar() {
        System.out.println("加糖");
    }

    //加奶
    public void addMilk() {
        System.out.println("加奶");
    }
}

CoffeeStore

public class CoffeeStore {

    public Coffee orderCoffee(String type) {
        //声明Coffee类型的变量,根据不同类型创建不同的coffee子类对象
        Coffee coffee = null;
        if("american".equals(type)) {
            coffee = new AmericanCoffee();
        } else if("latte".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("对不起,您所点的咖啡没有");
        }
        //加配料
        coffee.addMilk();
        coffee.addsugar();

        return coffee;
    }
}

LatteCoffee

public class LatteCoffee extends Coffee {

    public String getName() {
        return "拿铁咖啡";
    }
}

AmericanCoffee

public class AmericanCoffee extends Coffee {

    public String getName() {
        return "美式咖啡";
    }
}

Client

public class Client {
    public static void main(String[] args) {
        //1,创建咖啡店类
        CoffeeStore store = new CoffeeStore();
        //2,点咖啡
        Coffee coffee = store.orderCoffee("latte");

        System.out.println(coffee.getName());
    }
}

在这里插入图片描述

上面的案例中CoffeeStore依赖于美式咖啡类以及拿铁咖啡类,存在耦合,若果后期我们需要添加一种品种的咖啡的话,势必要修改这个类中的代码,这就违背了设计原则的开闭原则,因为我们扩展新功能的时候修改了之前的代码;

在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。

如果我们使用工厂来生产对象,我们就只需要和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值