Head First 设计模式(4)工厂模式

2021-07-11  本文已影响0人  kaiker

1、本章的例子——披萨店

当点披萨时,需要创建披萨对象,一个店可能有很多种披萨
但是按下方的写法,变化(创建pizza对象)的部分没有封装

Pizza orderPizza () {
  // Pizza pizza = new Pizza();

  Pizza pizza;
  if (type.equals("cheese")) {
    pizza = new CheesePizza();
  } else if (type.equals("greek")) {
    pizza = new GreekPizza();
  }
}

  pizza.prepare();
  pizza.bake();
  pizza.cut();
  pizza.box();

一个简单工厂,来new对象

public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
      Pizza pizza = null;
      if (type.equals("cheese")) pizza = new CheesePizza();
      ......
    }
}

public class PizzaStore {
  SimplePizzaFactory factory;

  public PizzaStore (SimplePizzaFactory factory) {
    this.factory = factory;
  }

  public Pizza orderPizza(String type) {
    Pizza pizza;
  
    pizza = factory.createPizza(type);
  }
}

现在披萨店有加盟店了,不同的加盟店要创建不同的披萨,可能创建的方式也有不同

public abstract class PizzaStore {
  public Pizza orderPizza(String type) {
    Pizza pizza;

    pizza.prepare();
    ...
  }

  abstract Pizza createPizza(String type);
}
这样加盟店可以自定义对象的创建

2、工厂方法模式

定义了一个创建对象的接口,但由子类决定实例化的类是哪一个

工厂方法模式
披萨店中的工厂方法模式

3、设计原则

依赖抽象,不依赖具体类

披萨店实践

4、另一个例子——比萨原料工厂

各地加盟商需要用不同的原料来制作不同风味的比萨

// 原料工厂
public interface PizzaIngredientFactory {
  public Dough createDough();
  public Sauce createSauce();
  public Cheese createCheese();
  public Clams createClam();
}

// 工厂实现
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
  public Dough createDough() {
    retrun new ThinCrustDough();
  }

  ......
}
工厂提供原料的创建,组合到了Pizza中

5、抽象工厂模式

提供一个接口,用于创建相关或依赖对象的家族,不需要明确指定具体类

抽象工厂 Pizza店原料抽象工厂
上一篇 下一篇

猜你喜欢

热点阅读