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();
}
......
}

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


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