CodeGym /Java 博客 /随机的 /工厂设计模式
John Squirrels
第 41 级
San Francisco

工厂设计模式

已在 随机的 群组中发布
朋友你好!今天我们继续学习设计模式。在本课中,我们将讨论工厂。我们将讨论此模式解决的问题,并查看工厂如何帮助您开设咖啡店的示例。此外,我将为您提供创建工厂的 5 个简单步骤。 工厂设计模式 - 1 为确保我们都在同一个波长上并且您将快速掌握这个概念,您应该熟悉以下主题:
  • 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方法可以分为两部分:
  1. 在语句中创建咖啡的特定实例switch。这就是工厂做它做的事情的地方——根据条件创建一个特定的类型。
  2. 准备——这是研磨、冲泡和倒入杯中。
如果您将来需要更改该方法,请务必了解以下内容:
  1. 准备过程本身所涉及的步骤(研磨、冲泡和倒入杯中)将保持不变(至少我们指望这一点)。
  2. 但是咖啡的种类可能会改变。也许我们会开始制作摩卡……Frappu……Mochacci……不管怎样,一种新的咖啡。
我们已经相当有信心,将来我们将不得不对方法的switch声明进行更改。也有可能在我们的咖啡店中,这种orderCoffee方法将不是我们制作不同类型咖啡的唯一场所。因此,必须在几个地方进行更改。你可能已经明白我的意思了。我们需要重构。将负责制作咖啡的块移到一个单独的类中有两个原因:
  1. 我们可以在其他地方重用煮咖啡的逻辑。
  2. 如果分类发生变化,我们将不必在创建咖啡的所有地方编辑代码。只需在一个地方更改我们的代码就足够了。
也就是说,是时候建厂了。

建立我们的第一家工厂

为此,我们将创建一个新类,它只负责创建必要的咖啡类实例:

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。但是这样我们就会失去两个能力:
  1. SimpleCoffeeFactory继承和覆盖方法的能力createCoffee
  2. 能够将所需的工厂实现添加到我们的类中。
顺便说一句,说到实施……我们需要回到咖啡店并添加我们的咖啡机。

给咖啡店加工厂

让我们使用工厂重写咖啡店类:

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. 您的程序有一个具有多个后代的类,如下图所示: 工厂设计模式 - 2步骤 2. 您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;
        }
    }
现在你可以像老板一样经营一家工厂。:)

如何练习

看书好,写代码更棒。如果您的名字有偶数个字母,请尝试创建您自己的虚拟比萨店。如果您的名字有奇数个字母,请尝试创建一个虚拟寿司吧。如果你没有名字,那你就走运了。今天你可以放松一下。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION