朋友你好!今天我们继续学习设计模式。在本课中,我们将讨论工厂。我们将讨论此模式解决的问题,并查看工厂如何帮助您开设咖啡店的示例。此外,我将为您提供创建工厂的 5 个简单步骤。
为确保我们都在同一个波长上并且您将快速掌握这个概念,您应该熟悉以下主题:
步骤 2. 您

- Java 中的继承
- 缩小和扩大 Java 中的引用类型
- 不同类和对象之间的交互。
什么是工厂?
工厂设计模式让您可以控制对象的创建。创建新对象的过程并不简单,但也不过分复杂。我们都知道我们需要new
操作符来创建一个新的对象。也许这里似乎没有什么可以控制的,但事实并非如此。假设我们的应用程序有一个具有许多后代的特定类。当需要根据特定条件创建特定类的实例时,可能会出现困难。工厂是一种设计模式,可帮助解决根据特定条件创建各种对象的问题。这对于一个抽象概念来说怎么样?当我们查看下面的示例时,这将变得更加清晰和具体。
让我们准备各种类型的咖啡
假设我们想让一家咖啡店自动化。我们需要教我们的程序如何制作不同类型的咖啡。为此,我们将创建一个咖啡类和一些衍生类来表示我们将准备的咖啡类型:美式咖啡、卡布奇诺咖啡、浓缩咖啡和拿铁咖啡。让我们从一般的咖啡课开始:
public class Coffee {
public void grindCoffee(){
// Grind the coffee
}
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
接下来,我们将创建它的子类:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
我们的客户可以订购任何类型的咖啡。他们的命令需要传递给程序。这可以通过多种方式完成,例如,使用String
. 但是 anenum
是最好的。我们将创建enum
并定义与可以订购的咖啡类型相对应的枚举字段:
public enum CoffeeType {
ESPRESSO,
AMERICANO,
CAFFE_LATTE,
CAPPUCCINO
}
伟大的。现在让我们为我们的咖啡店编写代码:
public class CoffeeShop {
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucсino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
该orderCoffee
方法可以分为两部分:
- 在语句中创建咖啡的特定实例
switch
。这就是工厂做它做的事情的地方——根据条件创建一个特定的类型。 - 准备——这是研磨、冲泡和倒入杯中。
- 准备过程本身所涉及的步骤(研磨、冲泡和倒入杯中)将保持不变(至少我们指望这一点)。
- 但是咖啡的种类可能会改变。也许我们会开始制作摩卡……Frappu……Mochacci……不管怎样,一种新的咖啡。
switch
声明进行更改。也有可能在我们的咖啡店中,这种orderCoffee
方法将不是我们制作不同类型咖啡的唯一场所。因此,必须在几个地方进行更改。你可能已经明白我的意思了。我们需要重构。将负责制作咖啡的块移到一个单独的类中有两个原因:
- 我们可以在其他地方重用煮咖啡的逻辑。
- 如果分类发生变化,我们将不必在创建咖啡的所有地方编辑代码。只需在一个地方更改我们的代码就足够了。
建立我们的第一家工厂
为此,我们将创建一个新类,它只负责创建必要的咖啡类实例:
public class SimpleCoffeeFactory {
public Coffee createCoffee(CoffeeType type) {
Coffee coffee = null;
switch (type) {
case AMERICANO:
coffee = new Americano();
break;
case ESPRESSO:
coffee = new Espresso();
break;
case CAPPUCCINO:
coffee = new Cappucino();
break;
case CAFFE_LATTE:
coffee = new CaffeLatte();
break;
}
return coffee;
}
}
恭喜!我们刚刚以最简单的形式(几乎)实现了工厂设计模式。如果我们将方法设为静态,它可能会更简单createCoffee
。但是这样我们就会失去两个能力:
SimpleCoffeeFactory
继承和覆盖方法的能力createCoffee
。- 能够将所需的工厂实现添加到我们的类中。
给咖啡店加工厂
让我们使用工厂重写咖啡店类:
public class CoffeeShop {
private final SimpleCoffeeFactory coffeeFactory;
public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee(CoffeeType type) {
Coffee coffee = coffeeFactory.createCoffee(type);
coffee.grindCoffee();
coffee.makeCoffee();
coffee.pourIntoCup();
System.out.println("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
出色的。现在我们将简要描述工厂设计模式的一般结构。
开设自己的工厂的 5 个步骤
步骤 1. 您的程序有一个具有多个后代的类,如下图所示:
enum
为每个子类创建一个带有字段的类:
enum CatType {
LION,
TIGER,
FLUFFY
}
第 3 步。建立你的工厂。打电话吧CatFactory
。这是代码:
class CatFactory {}
第 4 步。在您的工厂中,创建一个createCat
带有CatType
参数的方法。这是代码:
class CatFactory {
public Cat createCat(CatType type) {
}
}
第 5 步。在方法的主体中,编写switch
枚举枚举字段并创建与传递的enum
值对应的类的实例的语句:
class CatFactory {
public Cat createCat(CatType type) {
Cat cat = null;
switch (type) {
case LION:
cat = new Fluffy();
break;
case TIGER:
cat = new Tiger();
break;
case FLUFFY:
cat = new Lion();
break;
}
return cat;
}
}
现在你可以像老板一样经营一家工厂。:)
GO TO FULL VERSION