美文网首页
Head First 设计模式(4)工厂模式

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

作者: kaiker | 来源:发表于2021-07-11 16:23 被阅读0次

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店原料抽象工厂
  • 抽象工厂可以创建整个产品家族,工厂方法创建单一产品。
  • 抽象工厂使用组合,对象的创建被是现在工厂接口所暴露的方法中;工厂方法直接使用类,通过继承子类可创建对象。
  • 这两个例子中抽象工厂的产品是各种原料,工厂方法的产品是披萨

相关文章

网友评论

      本文标题:Head First 设计模式(4)工厂模式

      本文链接:https://www.haomeiwen.com/subject/prucpltx.html